{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "toc": true
   },
   "source": [
    "<h1>Table of Contents<span class=\"tocSkip\"></span></h1>\n",
    "<div class=\"toc\"><ul class=\"toc-item\"><li><span><a href=\"#数据管道Dataset\" data-toc-modified-id=\"数据管道Dataset-1\"><span class=\"toc-item-num\">1&nbsp;&nbsp;</span>数据管道<code>Dataset</code></a></span><ul class=\"toc-item\"><li><span><a href=\"#创建Dataset\" data-toc-modified-id=\"创建Dataset-1.1\"><span class=\"toc-item-num\">1.1&nbsp;&nbsp;</span>创建<code>Dataset</code></a></span></li><li><span><a href=\"#数据处理\" data-toc-modified-id=\"数据处理-1.2\"><span class=\"toc-item-num\">1.2&nbsp;&nbsp;</span>数据处理</a></span></li><li><span><a href=\"#提升性能\" data-toc-modified-id=\"提升性能-1.3\"><span class=\"toc-item-num\">1.3&nbsp;&nbsp;</span>提升性能</a></span></li></ul></li><li><span><a href=\"#创建特征\" data-toc-modified-id=\"创建特征-2\"><span class=\"toc-item-num\">2&nbsp;&nbsp;</span>创建特征</a></span></li></ul></div>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 数据管道`Dataset`\n",
    "- 当需要训练的数据很大，例如超过10G，无法一次载入内存，那么通常需要在训练的过程中分批逐渐读入。\n",
    "- 使用 `tf.data` API 可以构建数据输入管道，轻松处理大量的数据，不同的数据格式，以及不同的数据转换。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-06T08:07:48.991536Z",
     "start_time": "2020-04-06T08:07:47.981353Z"
    }
   },
   "outputs": [],
   "source": [
    "import tensorflow as tf\n",
    "import numpy as np\n",
    "from sklearn import datasets"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 创建`Dataset`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-06T08:09:52.083269Z",
     "start_time": "2020-04-06T08:09:52.073718Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'numpy.ndarray'> <class 'numpy.ndarray'>\n",
      "tf.Tensor([5.1 3.5 1.4 0.2], shape=(4,), dtype=float64) tf.Tensor(0, shape=(), dtype=int64)\n",
      "tf.Tensor([4.9 3.  1.4 0.2], shape=(4,), dtype=float64) tf.Tensor(0, shape=(), dtype=int64)\n"
     ]
    }
   ],
   "source": [
    "# Numpy array\n",
    "iris = datasets.load_iris()\n",
    "print(type(iris['data']), type(iris['target']))\n",
    "ds1 = tf.data.Dataset.from_tensor_slices((iris[\"data\"], iris[\"target\"]))\n",
    "for features, label in ds1.take(2):\n",
    "    print(features, label)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-06T08:12:28.240696Z",
     "start_time": "2020-04-06T08:12:28.227309Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "   sepal length (cm)  sepal width (cm)  petal length (cm)  petal width (cm)\n",
      "0                5.1               3.5                1.4               0.2\n",
      "1                4.9               3.0                1.4               0.2\n",
      "{'sepal length (cm)': <tf.Tensor: id=51, shape=(), dtype=float32, numpy=5.1>, 'sepal width (cm)': <tf.Tensor: id=52, shape=(), dtype=float32, numpy=3.5>, 'petal length (cm)': <tf.Tensor: id=49, shape=(), dtype=float32, numpy=1.4>, 'petal width (cm)': <tf.Tensor: id=50, shape=(), dtype=float32, numpy=0.2>} tf.Tensor(0, shape=(), dtype=int64)\n",
      "{'sepal length (cm)': <tf.Tensor: id=56, shape=(), dtype=float32, numpy=4.9>, 'sepal width (cm)': <tf.Tensor: id=57, shape=(), dtype=float32, numpy=3.0>, 'petal length (cm)': <tf.Tensor: id=54, shape=(), dtype=float32, numpy=1.4>, 'petal width (cm)': <tf.Tensor: id=55, shape=(), dtype=float32, numpy=0.2>} tf.Tensor(0, shape=(), dtype=int64)\n"
     ]
    }
   ],
   "source": [
    "# Pandas DataFrame\n",
    "import pandas as pd\n",
    "dfiris = pd.DataFrame(iris[\"data\"], columns=iris.feature_names)\n",
    "print(dfiris.head(2))\n",
    "\n",
    "ds2 = tf.data.Dataset.from_tensor_slices(\n",
    "    (dfiris.to_dict(\"list\"), iris[\"target\"]))\n",
    "for features, label in ds2.take(2):\n",
    "    print(features, label)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-06T08:17:06.585140Z",
     "start_time": "2020-04-06T08:17:06.351877Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Found 2000 images belonging to 2 classes.\n",
      "{'airplane': 0, 'automobile': 1}\n"
     ]
    }
   ],
   "source": [
    "# Python generator\n",
    "from matplotlib import pyplot as plt\n",
    "from tensorflow.keras.preprocessing.image import ImageDataGenerator\n",
    "\n",
    "image_generator = ImageDataGenerator(rescale=1.0 / 255).flow_from_directory(\n",
    "    \"datasets/cifar2/test\",\n",
    "    target_size=(32, 32),\n",
    "    batch_size=20,\n",
    "    class_mode='binary')\n",
    "classdict = image_generator.class_indices\n",
    "print(classdict)\n",
    "\n",
    "\n",
    "def generator():\n",
    "    for features, label in image_generator:\n",
    "        yield (features, label)\n",
    "\n",
    "\n",
    "ds3 = tf.data.Dataset.from_generator(generator,\n",
    "                                     output_types=(tf.float32, tf.int32))\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-06T08:17:31.846098Z",
     "start_time": "2020-04-06T08:17:31.540360Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
       "  \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
       "<!-- Created with matplotlib (https://matplotlib.org/) -->\n",
       "<svg height=\"359.178125pt\" version=\"1.1\" viewBox=\"0 0 350.158824 359.178125\" width=\"350.158824pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       " <defs>\n",
       "  <style type=\"text/css\">\n",
       "*{stroke-linecap:butt;stroke-linejoin:round;}\n",
       "  </style>\n",
       " </defs>\n",
       " <g id=\"figure_1\">\n",
       "  <g id=\"patch_1\">\n",
       "   <path d=\"M 0 359.178125 \n",
       "L 350.158824 359.178125 \n",
       "L 350.158824 0 \n",
       "L 0 0 \n",
       "z\n",
       "\" style=\"fill:none;\"/>\n",
       "  </g>\n",
       "  <g id=\"axes_1\">\n",
       "   <g id=\"patch_2\">\n",
       "    <path d=\"M 10.7 118.247537 \n",
       "L 106.629412 118.247537 \n",
       "L 106.629412 22.318125 \n",
       "L 10.7 22.318125 \n",
       "z\n",
       "\" style=\"fill:#ffffff;\"/>\n",
       "   </g>\n",
       "   <g clip-path=\"url(#p726af44660)\">\n",
       "    <image height=\"96\" id=\"imagec294a783cc\" transform=\"scale(1 -1)translate(0 -96)\" width=\"96\" x=\"10.7\" xlink:href=\"data:image/png;base64,\n",
       "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\" y=\"-22.247537\"/>\n",
       "   </g>\n",
       "   <g id=\"matplotlib.axis_1\"/>\n",
       "   <g id=\"matplotlib.axis_2\"/>\n",
       "   <g id=\"patch_3\">\n",
       "    <path d=\"M 10.7 118.247537 \n",
       "L 10.7 22.318125 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_4\">\n",
       "    <path d=\"M 106.629412 118.247537 \n",
       "L 106.629412 22.318125 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_5\">\n",
       "    <path d=\"M 10.7 118.247537 \n",
       "L 106.629412 118.247537 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_6\">\n",
       "    <path d=\"M 10.7 22.318125 \n",
       "L 106.629412 22.318125 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"text_1\">\n",
       "    <!-- label = 0 -->\n",
       "    <defs>\n",
       "     <path d=\"M 9.421875 75.984375 \n",
       "L 18.40625 75.984375 \n",
       "L 18.40625 0 \n",
       "L 9.421875 0 \n",
       "z\n",
       "\" id=\"DejaVuSans-108\"/>\n",
       "     <path d=\"M 34.28125 27.484375 \n",
       "Q 23.390625 27.484375 19.1875 25 \n",
       "Q 14.984375 22.515625 14.984375 16.5 \n",
       "Q 14.984375 11.71875 18.140625 8.90625 \n",
       "Q 21.296875 6.109375 26.703125 6.109375 \n",
       "Q 34.1875 6.109375 38.703125 11.40625 \n",
       "Q 43.21875 16.703125 43.21875 25.484375 \n",
       "L 43.21875 27.484375 \n",
       "z\n",
       "M 52.203125 31.203125 \n",
       "L 52.203125 0 \n",
       "L 43.21875 0 \n",
       "L 43.21875 8.296875 \n",
       "Q 40.140625 3.328125 35.546875 0.953125 \n",
       "Q 30.953125 -1.421875 24.3125 -1.421875 \n",
       "Q 15.921875 -1.421875 10.953125 3.296875 \n",
       "Q 6 8.015625 6 15.921875 \n",
       "Q 6 25.140625 12.171875 29.828125 \n",
       "Q 18.359375 34.515625 30.609375 34.515625 \n",
       "L 43.21875 34.515625 \n",
       "L 43.21875 35.40625 \n",
       "Q 43.21875 41.609375 39.140625 45 \n",
       "Q 35.0625 48.390625 27.6875 48.390625 \n",
       "Q 23 48.390625 18.546875 47.265625 \n",
       "Q 14.109375 46.140625 10.015625 43.890625 \n",
       "L 10.015625 52.203125 \n",
       "Q 14.9375 54.109375 19.578125 55.046875 \n",
       "Q 24.21875 56 28.609375 56 \n",
       "Q 40.484375 56 46.34375 49.84375 \n",
       "Q 52.203125 43.703125 52.203125 31.203125 \n",
       "z\n",
       "\" id=\"DejaVuSans-97\"/>\n",
       "     <path d=\"M 48.6875 27.296875 \n",
       "Q 48.6875 37.203125 44.609375 42.84375 \n",
       "Q 40.53125 48.484375 33.40625 48.484375 \n",
       "Q 26.265625 48.484375 22.1875 42.84375 \n",
       "Q 18.109375 37.203125 18.109375 27.296875 \n",
       "Q 18.109375 17.390625 22.1875 11.75 \n",
       "Q 26.265625 6.109375 33.40625 6.109375 \n",
       "Q 40.53125 6.109375 44.609375 11.75 \n",
       "Q 48.6875 17.390625 48.6875 27.296875 \n",
       "z\n",
       "M 18.109375 46.390625 \n",
       "Q 20.953125 51.265625 25.265625 53.625 \n",
       "Q 29.59375 56 35.59375 56 \n",
       "Q 45.5625 56 51.78125 48.09375 \n",
       "Q 58.015625 40.1875 58.015625 27.296875 \n",
       "Q 58.015625 14.40625 51.78125 6.484375 \n",
       "Q 45.5625 -1.421875 35.59375 -1.421875 \n",
       "Q 29.59375 -1.421875 25.265625 0.953125 \n",
       "Q 20.953125 3.328125 18.109375 8.203125 \n",
       "L 18.109375 0 \n",
       "L 9.078125 0 \n",
       "L 9.078125 75.984375 \n",
       "L 18.109375 75.984375 \n",
       "z\n",
       "\" id=\"DejaVuSans-98\"/>\n",
       "     <path d=\"M 56.203125 29.59375 \n",
       "L 56.203125 25.203125 \n",
       "L 14.890625 25.203125 \n",
       "Q 15.484375 15.921875 20.484375 11.0625 \n",
       "Q 25.484375 6.203125 34.421875 6.203125 \n",
       "Q 39.59375 6.203125 44.453125 7.46875 \n",
       "Q 49.3125 8.734375 54.109375 11.28125 \n",
       "L 54.109375 2.78125 \n",
       "Q 49.265625 0.734375 44.1875 -0.34375 \n",
       "Q 39.109375 -1.421875 33.890625 -1.421875 \n",
       "Q 20.796875 -1.421875 13.15625 6.1875 \n",
       "Q 5.515625 13.8125 5.515625 26.8125 \n",
       "Q 5.515625 40.234375 12.765625 48.109375 \n",
       "Q 20.015625 56 32.328125 56 \n",
       "Q 43.359375 56 49.78125 48.890625 \n",
       "Q 56.203125 41.796875 56.203125 29.59375 \n",
       "z\n",
       "M 47.21875 32.234375 \n",
       "Q 47.125 39.59375 43.09375 43.984375 \n",
       "Q 39.0625 48.390625 32.421875 48.390625 \n",
       "Q 24.90625 48.390625 20.390625 44.140625 \n",
       "Q 15.875 39.890625 15.1875 32.171875 \n",
       "z\n",
       "\" id=\"DejaVuSans-101\"/>\n",
       "     <path id=\"DejaVuSans-32\"/>\n",
       "     <path d=\"M 10.59375 45.40625 \n",
       "L 73.1875 45.40625 \n",
       "L 73.1875 37.203125 \n",
       "L 10.59375 37.203125 \n",
       "z\n",
       "M 10.59375 25.484375 \n",
       "L 73.1875 25.484375 \n",
       "L 73.1875 17.1875 \n",
       "L 10.59375 17.1875 \n",
       "z\n",
       "\" id=\"DejaVuSans-61\"/>\n",
       "     <path d=\"M 31.78125 66.40625 \n",
       "Q 24.171875 66.40625 20.328125 58.90625 \n",
       "Q 16.5 51.421875 16.5 36.375 \n",
       "Q 16.5 21.390625 20.328125 13.890625 \n",
       "Q 24.171875 6.390625 31.78125 6.390625 \n",
       "Q 39.453125 6.390625 43.28125 13.890625 \n",
       "Q 47.125 21.390625 47.125 36.375 \n",
       "Q 47.125 51.421875 43.28125 58.90625 \n",
       "Q 39.453125 66.40625 31.78125 66.40625 \n",
       "z\n",
       "M 31.78125 74.21875 \n",
       "Q 44.046875 74.21875 50.515625 64.515625 \n",
       "Q 56.984375 54.828125 56.984375 36.375 \n",
       "Q 56.984375 17.96875 50.515625 8.265625 \n",
       "Q 44.046875 -1.421875 31.78125 -1.421875 \n",
       "Q 19.53125 -1.421875 13.0625 8.265625 \n",
       "Q 6.59375 17.96875 6.59375 36.375 \n",
       "Q 6.59375 54.828125 13.0625 64.515625 \n",
       "Q 19.53125 74.21875 31.78125 74.21875 \n",
       "z\n",
       "\" id=\"DejaVuSans-48\"/>\n",
       "    </defs>\n",
       "    <g transform=\"translate(31.494081 16.318125)scale(0.12 -0.12)\">\n",
       "     <use xlink:href=\"#DejaVuSans-108\"/>\n",
       "     <use x=\"27.783203\" xlink:href=\"#DejaVuSans-97\"/>\n",
       "     <use x=\"89.0625\" xlink:href=\"#DejaVuSans-98\"/>\n",
       "     <use x=\"152.539062\" xlink:href=\"#DejaVuSans-101\"/>\n",
       "     <use x=\"214.0625\" xlink:href=\"#DejaVuSans-108\"/>\n",
       "     <use x=\"241.845703\" xlink:href=\"#DejaVuSans-32\"/>\n",
       "     <use x=\"273.632812\" xlink:href=\"#DejaVuSans-61\"/>\n",
       "     <use x=\"357.421875\" xlink:href=\"#DejaVuSans-32\"/>\n",
       "     <use x=\"389.208984\" xlink:href=\"#DejaVuSans-48\"/>\n",
       "    </g>\n",
       "   </g>\n",
       "  </g>\n",
       "  <g id=\"axes_2\">\n",
       "   <g id=\"patch_7\">\n",
       "    <path d=\"M 128.864706 118.247537 \n",
       "L 224.794118 118.247537 \n",
       "L 224.794118 22.318125 \n",
       "L 128.864706 22.318125 \n",
       "z\n",
       "\" style=\"fill:#ffffff;\"/>\n",
       "   </g>\n",
       "   <g clip-path=\"url(#p2db7b16428)\">\n",
       "    <image height=\"96\" id=\"image525e5f9c93\" transform=\"scale(1 -1)translate(0 -96)\" width=\"96\" x=\"128.864706\" xlink:href=\"data:image/png;base64,\n",
       "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\" y=\"-22.247537\"/>\n",
       "   </g>\n",
       "   <g id=\"matplotlib.axis_3\"/>\n",
       "   <g id=\"matplotlib.axis_4\"/>\n",
       "   <g id=\"patch_8\">\n",
       "    <path d=\"M 128.864706 118.247537 \n",
       "L 128.864706 22.318125 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_9\">\n",
       "    <path d=\"M 224.794118 118.247537 \n",
       "L 224.794118 22.318125 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_10\">\n",
       "    <path d=\"M 128.864706 118.247537 \n",
       "L 224.794118 118.247537 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_11\">\n",
       "    <path d=\"M 128.864706 22.318125 \n",
       "L 224.794118 22.318125 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"text_2\">\n",
       "    <!-- label = 1 -->\n",
       "    <defs>\n",
       "     <path d=\"M 12.40625 8.296875 \n",
       "L 28.515625 8.296875 \n",
       "L 28.515625 63.921875 \n",
       "L 10.984375 60.40625 \n",
       "L 10.984375 69.390625 \n",
       "L 28.421875 72.90625 \n",
       "L 38.28125 72.90625 \n",
       "L 38.28125 8.296875 \n",
       "L 54.390625 8.296875 \n",
       "L 54.390625 0 \n",
       "L 12.40625 0 \n",
       "z\n",
       "\" id=\"DejaVuSans-49\"/>\n",
       "    </defs>\n",
       "    <g transform=\"translate(149.658787 16.318125)scale(0.12 -0.12)\">\n",
       "     <use xlink:href=\"#DejaVuSans-108\"/>\n",
       "     <use x=\"27.783203\" xlink:href=\"#DejaVuSans-97\"/>\n",
       "     <use x=\"89.0625\" xlink:href=\"#DejaVuSans-98\"/>\n",
       "     <use x=\"152.539062\" xlink:href=\"#DejaVuSans-101\"/>\n",
       "     <use x=\"214.0625\" xlink:href=\"#DejaVuSans-108\"/>\n",
       "     <use x=\"241.845703\" xlink:href=\"#DejaVuSans-32\"/>\n",
       "     <use x=\"273.632812\" xlink:href=\"#DejaVuSans-61\"/>\n",
       "     <use x=\"357.421875\" xlink:href=\"#DejaVuSans-32\"/>\n",
       "     <use x=\"389.208984\" xlink:href=\"#DejaVuSans-49\"/>\n",
       "    </g>\n",
       "   </g>\n",
       "  </g>\n",
       "  <g id=\"axes_3\">\n",
       "   <g id=\"patch_12\">\n",
       "    <path d=\"M 247.029412 118.247537 \n",
       "L 342.958824 118.247537 \n",
       "L 342.958824 22.318125 \n",
       "L 247.029412 22.318125 \n",
       "z\n",
       "\" style=\"fill:#ffffff;\"/>\n",
       "   </g>\n",
       "   <g clip-path=\"url(#p4765db2972)\">\n",
       "    <image height=\"96\" id=\"image36db135a3b\" transform=\"scale(1 -1)translate(0 -96)\" width=\"96\" x=\"247.029412\" xlink:href=\"data:image/png;base64,\n",
       "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\" y=\"-22.247537\"/>\n",
       "   </g>\n",
       "   <g id=\"matplotlib.axis_5\"/>\n",
       "   <g id=\"matplotlib.axis_6\"/>\n",
       "   <g id=\"patch_13\">\n",
       "    <path d=\"M 247.029412 118.247537 \n",
       "L 247.029412 22.318125 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_14\">\n",
       "    <path d=\"M 342.958824 118.247537 \n",
       "L 342.958824 22.318125 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_15\">\n",
       "    <path d=\"M 247.029412 118.247537 \n",
       "L 342.958824 118.247537 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_16\">\n",
       "    <path d=\"M 247.029412 22.318125 \n",
       "L 342.958824 22.318125 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"text_3\">\n",
       "    <!-- label = 1 -->\n",
       "    <g transform=\"translate(267.823493 16.318125)scale(0.12 -0.12)\">\n",
       "     <use xlink:href=\"#DejaVuSans-108\"/>\n",
       "     <use x=\"27.783203\" xlink:href=\"#DejaVuSans-97\"/>\n",
       "     <use x=\"89.0625\" xlink:href=\"#DejaVuSans-98\"/>\n",
       "     <use x=\"152.539062\" xlink:href=\"#DejaVuSans-101\"/>\n",
       "     <use x=\"214.0625\" xlink:href=\"#DejaVuSans-108\"/>\n",
       "     <use x=\"241.845703\" xlink:href=\"#DejaVuSans-32\"/>\n",
       "     <use x=\"273.632812\" xlink:href=\"#DejaVuSans-61\"/>\n",
       "     <use x=\"357.421875\" xlink:href=\"#DejaVuSans-32\"/>\n",
       "     <use x=\"389.208984\" xlink:href=\"#DejaVuSans-49\"/>\n",
       "    </g>\n",
       "   </g>\n",
       "  </g>\n",
       "  <g id=\"axes_4\">\n",
       "   <g id=\"patch_17\">\n",
       "    <path d=\"M 10.7 233.362831 \n",
       "L 106.629412 233.362831 \n",
       "L 106.629412 137.433419 \n",
       "L 10.7 137.433419 \n",
       "z\n",
       "\" style=\"fill:#ffffff;\"/>\n",
       "   </g>\n",
       "   <g clip-path=\"url(#p0627b50503)\">\n",
       "    <image height=\"96\" id=\"imagec1a1c34e02\" transform=\"scale(1 -1)translate(0 -96)\" width=\"96\" x=\"10.7\" xlink:href=\"data:image/png;base64,\n",
       "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\" y=\"-137.362831\"/>\n",
       "   </g>\n",
       "   <g id=\"matplotlib.axis_7\"/>\n",
       "   <g id=\"matplotlib.axis_8\"/>\n",
       "   <g id=\"patch_18\">\n",
       "    <path d=\"M 10.7 233.362831 \n",
       "L 10.7 137.433419 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_19\">\n",
       "    <path d=\"M 106.629412 233.362831 \n",
       "L 106.629412 137.433419 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_20\">\n",
       "    <path d=\"M 10.7 233.362831 \n",
       "L 106.629412 233.362831 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_21\">\n",
       "    <path d=\"M 10.7 137.433419 \n",
       "L 106.629412 137.433419 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"text_4\">\n",
       "    <!-- label = 1 -->\n",
       "    <g transform=\"translate(31.494081 131.433419)scale(0.12 -0.12)\">\n",
       "     <use xlink:href=\"#DejaVuSans-108\"/>\n",
       "     <use x=\"27.783203\" xlink:href=\"#DejaVuSans-97\"/>\n",
       "     <use x=\"89.0625\" xlink:href=\"#DejaVuSans-98\"/>\n",
       "     <use x=\"152.539062\" xlink:href=\"#DejaVuSans-101\"/>\n",
       "     <use x=\"214.0625\" xlink:href=\"#DejaVuSans-108\"/>\n",
       "     <use x=\"241.845703\" xlink:href=\"#DejaVuSans-32\"/>\n",
       "     <use x=\"273.632812\" xlink:href=\"#DejaVuSans-61\"/>\n",
       "     <use x=\"357.421875\" xlink:href=\"#DejaVuSans-32\"/>\n",
       "     <use x=\"389.208984\" xlink:href=\"#DejaVuSans-49\"/>\n",
       "    </g>\n",
       "   </g>\n",
       "  </g>\n",
       "  <g id=\"axes_5\">\n",
       "   <g id=\"patch_22\">\n",
       "    <path d=\"M 128.864706 233.362831 \n",
       "L 224.794118 233.362831 \n",
       "L 224.794118 137.433419 \n",
       "L 128.864706 137.433419 \n",
       "z\n",
       "\" style=\"fill:#ffffff;\"/>\n",
       "   </g>\n",
       "   <g clip-path=\"url(#p4a438eefe7)\">\n",
       "    <image height=\"96\" id=\"image21a3d868c0\" transform=\"scale(1 -1)translate(0 -96)\" width=\"96\" x=\"128.864706\" xlink:href=\"data:image/png;base64,\n",
       "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\" y=\"-137.362831\"/>\n",
       "   </g>\n",
       "   <g id=\"matplotlib.axis_9\"/>\n",
       "   <g id=\"matplotlib.axis_10\"/>\n",
       "   <g id=\"patch_23\">\n",
       "    <path d=\"M 128.864706 233.362831 \n",
       "L 128.864706 137.433419 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_24\">\n",
       "    <path d=\"M 224.794118 233.362831 \n",
       "L 224.794118 137.433419 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_25\">\n",
       "    <path d=\"M 128.864706 233.362831 \n",
       "L 224.794118 233.362831 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_26\">\n",
       "    <path d=\"M 128.864706 137.433419 \n",
       "L 224.794118 137.433419 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"text_5\">\n",
       "    <!-- label = 0 -->\n",
       "    <g transform=\"translate(149.658787 131.433419)scale(0.12 -0.12)\">\n",
       "     <use xlink:href=\"#DejaVuSans-108\"/>\n",
       "     <use x=\"27.783203\" xlink:href=\"#DejaVuSans-97\"/>\n",
       "     <use x=\"89.0625\" xlink:href=\"#DejaVuSans-98\"/>\n",
       "     <use x=\"152.539062\" xlink:href=\"#DejaVuSans-101\"/>\n",
       "     <use x=\"214.0625\" xlink:href=\"#DejaVuSans-108\"/>\n",
       "     <use x=\"241.845703\" xlink:href=\"#DejaVuSans-32\"/>\n",
       "     <use x=\"273.632812\" xlink:href=\"#DejaVuSans-61\"/>\n",
       "     <use x=\"357.421875\" xlink:href=\"#DejaVuSans-32\"/>\n",
       "     <use x=\"389.208984\" xlink:href=\"#DejaVuSans-48\"/>\n",
       "    </g>\n",
       "   </g>\n",
       "  </g>\n",
       "  <g id=\"axes_6\">\n",
       "   <g id=\"patch_27\">\n",
       "    <path d=\"M 247.029412 233.362831 \n",
       "L 342.958824 233.362831 \n",
       "L 342.958824 137.433419 \n",
       "L 247.029412 137.433419 \n",
       "z\n",
       "\" style=\"fill:#ffffff;\"/>\n",
       "   </g>\n",
       "   <g clip-path=\"url(#pd63d20e97b)\">\n",
       "    <image height=\"96\" id=\"image6b7a666ab0\" transform=\"scale(1 -1)translate(0 -96)\" width=\"96\" x=\"247.029412\" xlink:href=\"data:image/png;base64,\n",
       "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\" y=\"-137.362831\"/>\n",
       "   </g>\n",
       "   <g id=\"matplotlib.axis_11\"/>\n",
       "   <g id=\"matplotlib.axis_12\"/>\n",
       "   <g id=\"patch_28\">\n",
       "    <path d=\"M 247.029412 233.362831 \n",
       "L 247.029412 137.433419 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_29\">\n",
       "    <path d=\"M 342.958824 233.362831 \n",
       "L 342.958824 137.433419 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_30\">\n",
       "    <path d=\"M 247.029412 233.362831 \n",
       "L 342.958824 233.362831 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_31\">\n",
       "    <path d=\"M 247.029412 137.433419 \n",
       "L 342.958824 137.433419 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"text_6\">\n",
       "    <!-- label = 1 -->\n",
       "    <g transform=\"translate(267.823493 131.433419)scale(0.12 -0.12)\">\n",
       "     <use xlink:href=\"#DejaVuSans-108\"/>\n",
       "     <use x=\"27.783203\" xlink:href=\"#DejaVuSans-97\"/>\n",
       "     <use x=\"89.0625\" xlink:href=\"#DejaVuSans-98\"/>\n",
       "     <use x=\"152.539062\" xlink:href=\"#DejaVuSans-101\"/>\n",
       "     <use x=\"214.0625\" xlink:href=\"#DejaVuSans-108\"/>\n",
       "     <use x=\"241.845703\" xlink:href=\"#DejaVuSans-32\"/>\n",
       "     <use x=\"273.632812\" xlink:href=\"#DejaVuSans-61\"/>\n",
       "     <use x=\"357.421875\" xlink:href=\"#DejaVuSans-32\"/>\n",
       "     <use x=\"389.208984\" xlink:href=\"#DejaVuSans-49\"/>\n",
       "    </g>\n",
       "   </g>\n",
       "  </g>\n",
       "  <g id=\"axes_7\">\n",
       "   <g id=\"patch_32\">\n",
       "    <path d=\"M 10.7 348.478125 \n",
       "L 106.629412 348.478125 \n",
       "L 106.629412 252.548713 \n",
       "L 10.7 252.548713 \n",
       "z\n",
       "\" style=\"fill:#ffffff;\"/>\n",
       "   </g>\n",
       "   <g clip-path=\"url(#pced8c4b14e)\">\n",
       "    <image height=\"96\" id=\"imageb5a67659bf\" transform=\"scale(1 -1)translate(0 -96)\" width=\"96\" x=\"10.7\" xlink:href=\"data:image/png;base64,\n",
       "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\" y=\"-252.478125\"/>\n",
       "   </g>\n",
       "   <g id=\"matplotlib.axis_13\"/>\n",
       "   <g id=\"matplotlib.axis_14\"/>\n",
       "   <g id=\"patch_33\">\n",
       "    <path d=\"M 10.7 348.478125 \n",
       "L 10.7 252.548713 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_34\">\n",
       "    <path d=\"M 106.629412 348.478125 \n",
       "L 106.629412 252.548713 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_35\">\n",
       "    <path d=\"M 10.7 348.478125 \n",
       "L 106.629412 348.478125 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_36\">\n",
       "    <path d=\"M 10.7 252.548713 \n",
       "L 106.629412 252.548713 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"text_7\">\n",
       "    <!-- label = 0 -->\n",
       "    <g transform=\"translate(31.494081 246.548713)scale(0.12 -0.12)\">\n",
       "     <use xlink:href=\"#DejaVuSans-108\"/>\n",
       "     <use x=\"27.783203\" xlink:href=\"#DejaVuSans-97\"/>\n",
       "     <use x=\"89.0625\" xlink:href=\"#DejaVuSans-98\"/>\n",
       "     <use x=\"152.539062\" xlink:href=\"#DejaVuSans-101\"/>\n",
       "     <use x=\"214.0625\" xlink:href=\"#DejaVuSans-108\"/>\n",
       "     <use x=\"241.845703\" xlink:href=\"#DejaVuSans-32\"/>\n",
       "     <use x=\"273.632812\" xlink:href=\"#DejaVuSans-61\"/>\n",
       "     <use x=\"357.421875\" xlink:href=\"#DejaVuSans-32\"/>\n",
       "     <use x=\"389.208984\" xlink:href=\"#DejaVuSans-48\"/>\n",
       "    </g>\n",
       "   </g>\n",
       "  </g>\n",
       "  <g id=\"axes_8\">\n",
       "   <g id=\"patch_37\">\n",
       "    <path d=\"M 128.864706 348.478125 \n",
       "L 224.794118 348.478125 \n",
       "L 224.794118 252.548713 \n",
       "L 128.864706 252.548713 \n",
       "z\n",
       "\" style=\"fill:#ffffff;\"/>\n",
       "   </g>\n",
       "   <g clip-path=\"url(#pda2eafff36)\">\n",
       "    <image height=\"96\" id=\"image1a6bc05c93\" transform=\"scale(1 -1)translate(0 -96)\" width=\"96\" x=\"128.864706\" xlink:href=\"data:image/png;base64,\n",
       "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\" y=\"-252.478125\"/>\n",
       "   </g>\n",
       "   <g id=\"matplotlib.axis_15\"/>\n",
       "   <g id=\"matplotlib.axis_16\"/>\n",
       "   <g id=\"patch_38\">\n",
       "    <path d=\"M 128.864706 348.478125 \n",
       "L 128.864706 252.548713 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_39\">\n",
       "    <path d=\"M 224.794118 348.478125 \n",
       "L 224.794118 252.548713 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_40\">\n",
       "    <path d=\"M 128.864706 348.478125 \n",
       "L 224.794118 348.478125 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_41\">\n",
       "    <path d=\"M 128.864706 252.548713 \n",
       "L 224.794118 252.548713 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"text_8\">\n",
       "    <!-- label = 0 -->\n",
       "    <g transform=\"translate(149.658787 246.548713)scale(0.12 -0.12)\">\n",
       "     <use xlink:href=\"#DejaVuSans-108\"/>\n",
       "     <use x=\"27.783203\" xlink:href=\"#DejaVuSans-97\"/>\n",
       "     <use x=\"89.0625\" xlink:href=\"#DejaVuSans-98\"/>\n",
       "     <use x=\"152.539062\" xlink:href=\"#DejaVuSans-101\"/>\n",
       "     <use x=\"214.0625\" xlink:href=\"#DejaVuSans-108\"/>\n",
       "     <use x=\"241.845703\" xlink:href=\"#DejaVuSans-32\"/>\n",
       "     <use x=\"273.632812\" xlink:href=\"#DejaVuSans-61\"/>\n",
       "     <use x=\"357.421875\" xlink:href=\"#DejaVuSans-32\"/>\n",
       "     <use x=\"389.208984\" xlink:href=\"#DejaVuSans-48\"/>\n",
       "    </g>\n",
       "   </g>\n",
       "  </g>\n",
       "  <g id=\"axes_9\">\n",
       "   <g id=\"patch_42\">\n",
       "    <path d=\"M 247.029412 348.478125 \n",
       "L 342.958824 348.478125 \n",
       "L 342.958824 252.548713 \n",
       "L 247.029412 252.548713 \n",
       "z\n",
       "\" style=\"fill:#ffffff;\"/>\n",
       "   </g>\n",
       "   <g clip-path=\"url(#p9a1e01c438)\">\n",
       "    <image height=\"96\" id=\"imagea80015399b\" transform=\"scale(1 -1)translate(0 -96)\" width=\"96\" x=\"247.029412\" xlink:href=\"data:image/png;base64,\n",
       "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\" y=\"-252.478125\"/>\n",
       "   </g>\n",
       "   <g id=\"matplotlib.axis_17\"/>\n",
       "   <g id=\"matplotlib.axis_18\"/>\n",
       "   <g id=\"patch_43\">\n",
       "    <path d=\"M 247.029412 348.478125 \n",
       "L 247.029412 252.548713 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_44\">\n",
       "    <path d=\"M 342.958824 348.478125 \n",
       "L 342.958824 252.548713 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_45\">\n",
       "    <path d=\"M 247.029412 348.478125 \n",
       "L 342.958824 348.478125 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_46\">\n",
       "    <path d=\"M 247.029412 252.548713 \n",
       "L 342.958824 252.548713 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"text_9\">\n",
       "    <!-- label = 1 -->\n",
       "    <g transform=\"translate(267.823493 246.548713)scale(0.12 -0.12)\">\n",
       "     <use xlink:href=\"#DejaVuSans-108\"/>\n",
       "     <use x=\"27.783203\" xlink:href=\"#DejaVuSans-97\"/>\n",
       "     <use x=\"89.0625\" xlink:href=\"#DejaVuSans-98\"/>\n",
       "     <use x=\"152.539062\" xlink:href=\"#DejaVuSans-101\"/>\n",
       "     <use x=\"214.0625\" xlink:href=\"#DejaVuSans-108\"/>\n",
       "     <use x=\"241.845703\" xlink:href=\"#DejaVuSans-32\"/>\n",
       "     <use x=\"273.632812\" xlink:href=\"#DejaVuSans-61\"/>\n",
       "     <use x=\"357.421875\" xlink:href=\"#DejaVuSans-32\"/>\n",
       "     <use x=\"389.208984\" xlink:href=\"#DejaVuSans-49\"/>\n",
       "    </g>\n",
       "   </g>\n",
       "  </g>\n",
       " </g>\n",
       " <defs>\n",
       "  <clipPath id=\"p726af44660\">\n",
       "   <rect height=\"95.929412\" width=\"95.929412\" x=\"10.7\" y=\"22.318125\"/>\n",
       "  </clipPath>\n",
       "  <clipPath id=\"p2db7b16428\">\n",
       "   <rect height=\"95.929412\" width=\"95.929412\" x=\"128.864706\" y=\"22.318125\"/>\n",
       "  </clipPath>\n",
       "  <clipPath id=\"p4765db2972\">\n",
       "   <rect height=\"95.929412\" width=\"95.929412\" x=\"247.029412\" y=\"22.318125\"/>\n",
       "  </clipPath>\n",
       "  <clipPath id=\"p0627b50503\">\n",
       "   <rect height=\"95.929412\" width=\"95.929412\" x=\"10.7\" y=\"137.433419\"/>\n",
       "  </clipPath>\n",
       "  <clipPath id=\"p4a438eefe7\">\n",
       "   <rect height=\"95.929412\" width=\"95.929412\" x=\"128.864706\" y=\"137.433419\"/>\n",
       "  </clipPath>\n",
       "  <clipPath id=\"pd63d20e97b\">\n",
       "   <rect height=\"95.929412\" width=\"95.929412\" x=\"247.029412\" y=\"137.433419\"/>\n",
       "  </clipPath>\n",
       "  <clipPath id=\"pced8c4b14e\">\n",
       "   <rect height=\"95.929412\" width=\"95.929412\" x=\"10.7\" y=\"252.548713\"/>\n",
       "  </clipPath>\n",
       "  <clipPath id=\"pda2eafff36\">\n",
       "   <rect height=\"95.929412\" width=\"95.929412\" x=\"128.864706\" y=\"252.548713\"/>\n",
       "  </clipPath>\n",
       "  <clipPath id=\"p9a1e01c438\">\n",
       "   <rect height=\"95.929412\" width=\"95.929412\" x=\"247.029412\" y=\"252.548713\"/>\n",
       "  </clipPath>\n",
       " </defs>\n",
       "</svg>\n"
      ],
      "text/plain": [
       "<Figure size 432x432 with 9 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "%config InlineBackend.figure_format = 'svg'\n",
    "\n",
    "plt.figure(figsize=(6, 6))\n",
    "for i, (img, label) in enumerate(ds3.unbatch().take(9)):\n",
    "    ax = plt.subplot(3, 3, i + 1)\n",
    "    ax.imshow(img.numpy())\n",
    "    ax.set_title(\"label = %d\" % label)\n",
    "    ax.set_xticks([])\n",
    "    ax.set_yticks([])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-06T08:18:48.900238Z",
     "start_time": "2020-04-06T08:18:48.853344Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "OrderedDict([('PassengerId', <tf.Tensor: id=341, shape=(3,), dtype=int32, numpy=array([254, 728, 349], dtype=int32)>), ('Pclass', <tf.Tensor: id=342, shape=(3,), dtype=int32, numpy=array([3, 3, 3], dtype=int32)>), ('Name', <tf.Tensor: id=339, shape=(3,), dtype=string, numpy=\n",
      "array([b'Lobb, Mr. William Arthur', b'Mannion, Miss. Margareth',\n",
      "       b'Coutts, Master. William Loch \"William\"'], dtype=object)>), ('Sex', <tf.Tensor: id=343, shape=(3,), dtype=string, numpy=array([b'male', b'female', b'male'], dtype=object)>), ('Age', <tf.Tensor: id=335, shape=(3,), dtype=float32, numpy=array([30.,  0.,  3.], dtype=float32)>), ('SibSp', <tf.Tensor: id=344, shape=(3,), dtype=int32, numpy=array([1, 0, 1], dtype=int32)>), ('Parch', <tf.Tensor: id=340, shape=(3,), dtype=int32, numpy=array([0, 0, 1], dtype=int32)>), ('Ticket', <tf.Tensor: id=345, shape=(3,), dtype=string, numpy=array([b'A/5. 3336', b'36866', b'C.A. 37671'], dtype=object)>), ('Fare', <tf.Tensor: id=338, shape=(3,), dtype=float32, numpy=array([16.1   ,  7.7375, 15.9   ], dtype=float32)>), ('Cabin', <tf.Tensor: id=336, shape=(3,), dtype=string, numpy=array([b'', b'', b''], dtype=object)>), ('Embarked', <tf.Tensor: id=337, shape=(3,), dtype=string, numpy=array([b'S', b'Q', b'S'], dtype=object)>)]) tf.Tensor([0 1 1], shape=(3,), dtype=int32)\n"
     ]
    }
   ],
   "source": [
    "# csv文件内容\n",
    "ds4 = tf.data.experimental.make_csv_dataset(\n",
    "    file_pattern=['datasets/titanic/train.csv', 'datasets/titanic/test.csv'],\n",
    "    batch_size=3,\n",
    "    label_name=\"Survived\",\n",
    "    na_value=\"\",\n",
    "    num_epochs=1,\n",
    "    ignore_errors=True)\n",
    "\n",
    "for data, label in ds4.take(1):\n",
    "    print(data, label)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-06T08:19:38.426494Z",
     "start_time": "2020-04-06T08:19:38.413959Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tf.Tensor(b'493,0,1,\"Molson, Mr. Harry Markland\",male,55.0,0,0,113787,30.5,C30,S', shape=(), dtype=string)\n",
      "tf.Tensor(b'53,1,1,\"Harper, Mrs. Henry Sleeper (Myna Haxtun)\",female,49.0,1,0,PC 17572,76.7292,D33,C', shape=(), dtype=string)\n"
     ]
    }
   ],
   "source": [
    "# 从文本文件\n",
    "ds5 = tf.data.TextLineDataset(\n",
    "    filenames=['datasets/titanic/train.csv', 'datasets/titanic/test.csv'\n",
    "               ]).skip(1)\n",
    "for line in ds5.take(2):\n",
    "    print(line)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-06T08:19:57.911417Z",
     "start_time": "2020-04-06T08:19:56.846020Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tf.Tensor(b'datasets/cifar2/train/airplane/4059.jpg', shape=(), dtype=string)\n",
      "tf.Tensor(b'datasets/cifar2/train/automobile/3004.jpg', shape=(), dtype=string)\n"
     ]
    }
   ],
   "source": [
    "# 从文件路径\n",
    "ds6 = tf.data.Dataset.list_files(\"datasets/cifar2/train/*/*.jpg\")\n",
    "for file in ds6.take(2):\n",
    "    print(file)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-06T08:20:23.115651Z",
     "start_time": "2020-04-06T08:20:22.876449Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
       "  \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
       "<!-- Created with matplotlib (https://matplotlib.org/) -->\n",
       "<svg height=\"250.458125pt\" version=\"1.1\" viewBox=\"0 0 235.34 250.458125\" width=\"235.34pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       " <defs>\n",
       "  <style type=\"text/css\">\n",
       "*{stroke-linecap:butt;stroke-linejoin:round;}\n",
       "  </style>\n",
       " </defs>\n",
       " <g id=\"figure_1\">\n",
       "  <g id=\"patch_1\">\n",
       "   <path d=\"M 0 250.458125 \n",
       "L 235.34 250.458125 \n",
       "L 235.34 0 \n",
       "L 0 0 \n",
       "z\n",
       "\" style=\"fill:none;\"/>\n",
       "  </g>\n",
       "  <g id=\"axes_1\">\n",
       "   <g id=\"patch_2\">\n",
       "    <path d=\"M 10.7 239.758125 \n",
       "L 228.14 239.758125 \n",
       "L 228.14 22.318125 \n",
       "L 10.7 22.318125 \n",
       "z\n",
       "\" style=\"fill:#ffffff;\"/>\n",
       "   </g>\n",
       "   <g clip-path=\"url(#pd6dfdd2602)\">\n",
       "    <image height=\"218\" id=\"image4067cd550d\" transform=\"scale(1 -1)translate(0 -218)\" width=\"218\" x=\"10.7\" xlink:href=\"data:image/png;base64,\n",
       "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\" y=\"-21.758125\"/>\n",
       "   </g>\n",
       "   <g id=\"matplotlib.axis_1\"/>\n",
       "   <g id=\"matplotlib.axis_2\"/>\n",
       "   <g id=\"patch_3\">\n",
       "    <path d=\"M 10.7 239.758125 \n",
       "L 10.7 22.318125 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_4\">\n",
       "    <path d=\"M 228.14 239.758125 \n",
       "L 228.14 22.318125 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_5\">\n",
       "    <path d=\"M 10.7 239.758125 \n",
       "L 228.14 239.758125 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_6\">\n",
       "    <path d=\"M 10.7 22.318125 \n",
       "L 228.14 22.318125 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"text_1\">\n",
       "    <!-- label = 0 -->\n",
       "    <defs>\n",
       "     <path d=\"M 9.421875 75.984375 \n",
       "L 18.40625 75.984375 \n",
       "L 18.40625 0 \n",
       "L 9.421875 0 \n",
       "z\n",
       "\" id=\"DejaVuSans-108\"/>\n",
       "     <path d=\"M 34.28125 27.484375 \n",
       "Q 23.390625 27.484375 19.1875 25 \n",
       "Q 14.984375 22.515625 14.984375 16.5 \n",
       "Q 14.984375 11.71875 18.140625 8.90625 \n",
       "Q 21.296875 6.109375 26.703125 6.109375 \n",
       "Q 34.1875 6.109375 38.703125 11.40625 \n",
       "Q 43.21875 16.703125 43.21875 25.484375 \n",
       "L 43.21875 27.484375 \n",
       "z\n",
       "M 52.203125 31.203125 \n",
       "L 52.203125 0 \n",
       "L 43.21875 0 \n",
       "L 43.21875 8.296875 \n",
       "Q 40.140625 3.328125 35.546875 0.953125 \n",
       "Q 30.953125 -1.421875 24.3125 -1.421875 \n",
       "Q 15.921875 -1.421875 10.953125 3.296875 \n",
       "Q 6 8.015625 6 15.921875 \n",
       "Q 6 25.140625 12.171875 29.828125 \n",
       "Q 18.359375 34.515625 30.609375 34.515625 \n",
       "L 43.21875 34.515625 \n",
       "L 43.21875 35.40625 \n",
       "Q 43.21875 41.609375 39.140625 45 \n",
       "Q 35.0625 48.390625 27.6875 48.390625 \n",
       "Q 23 48.390625 18.546875 47.265625 \n",
       "Q 14.109375 46.140625 10.015625 43.890625 \n",
       "L 10.015625 52.203125 \n",
       "Q 14.9375 54.109375 19.578125 55.046875 \n",
       "Q 24.21875 56 28.609375 56 \n",
       "Q 40.484375 56 46.34375 49.84375 \n",
       "Q 52.203125 43.703125 52.203125 31.203125 \n",
       "z\n",
       "\" id=\"DejaVuSans-97\"/>\n",
       "     <path d=\"M 48.6875 27.296875 \n",
       "Q 48.6875 37.203125 44.609375 42.84375 \n",
       "Q 40.53125 48.484375 33.40625 48.484375 \n",
       "Q 26.265625 48.484375 22.1875 42.84375 \n",
       "Q 18.109375 37.203125 18.109375 27.296875 \n",
       "Q 18.109375 17.390625 22.1875 11.75 \n",
       "Q 26.265625 6.109375 33.40625 6.109375 \n",
       "Q 40.53125 6.109375 44.609375 11.75 \n",
       "Q 48.6875 17.390625 48.6875 27.296875 \n",
       "z\n",
       "M 18.109375 46.390625 \n",
       "Q 20.953125 51.265625 25.265625 53.625 \n",
       "Q 29.59375 56 35.59375 56 \n",
       "Q 45.5625 56 51.78125 48.09375 \n",
       "Q 58.015625 40.1875 58.015625 27.296875 \n",
       "Q 58.015625 14.40625 51.78125 6.484375 \n",
       "Q 45.5625 -1.421875 35.59375 -1.421875 \n",
       "Q 29.59375 -1.421875 25.265625 0.953125 \n",
       "Q 20.953125 3.328125 18.109375 8.203125 \n",
       "L 18.109375 0 \n",
       "L 9.078125 0 \n",
       "L 9.078125 75.984375 \n",
       "L 18.109375 75.984375 \n",
       "z\n",
       "\" id=\"DejaVuSans-98\"/>\n",
       "     <path d=\"M 56.203125 29.59375 \n",
       "L 56.203125 25.203125 \n",
       "L 14.890625 25.203125 \n",
       "Q 15.484375 15.921875 20.484375 11.0625 \n",
       "Q 25.484375 6.203125 34.421875 6.203125 \n",
       "Q 39.59375 6.203125 44.453125 7.46875 \n",
       "Q 49.3125 8.734375 54.109375 11.28125 \n",
       "L 54.109375 2.78125 \n",
       "Q 49.265625 0.734375 44.1875 -0.34375 \n",
       "Q 39.109375 -1.421875 33.890625 -1.421875 \n",
       "Q 20.796875 -1.421875 13.15625 6.1875 \n",
       "Q 5.515625 13.8125 5.515625 26.8125 \n",
       "Q 5.515625 40.234375 12.765625 48.109375 \n",
       "Q 20.015625 56 32.328125 56 \n",
       "Q 43.359375 56 49.78125 48.890625 \n",
       "Q 56.203125 41.796875 56.203125 29.59375 \n",
       "z\n",
       "M 47.21875 32.234375 \n",
       "Q 47.125 39.59375 43.09375 43.984375 \n",
       "Q 39.0625 48.390625 32.421875 48.390625 \n",
       "Q 24.90625 48.390625 20.390625 44.140625 \n",
       "Q 15.875 39.890625 15.1875 32.171875 \n",
       "z\n",
       "\" id=\"DejaVuSans-101\"/>\n",
       "     <path id=\"DejaVuSans-32\"/>\n",
       "     <path d=\"M 10.59375 45.40625 \n",
       "L 73.1875 45.40625 \n",
       "L 73.1875 37.203125 \n",
       "L 10.59375 37.203125 \n",
       "z\n",
       "M 10.59375 25.484375 \n",
       "L 73.1875 25.484375 \n",
       "L 73.1875 17.1875 \n",
       "L 10.59375 17.1875 \n",
       "z\n",
       "\" id=\"DejaVuSans-61\"/>\n",
       "     <path d=\"M 31.78125 66.40625 \n",
       "Q 24.171875 66.40625 20.328125 58.90625 \n",
       "Q 16.5 51.421875 16.5 36.375 \n",
       "Q 16.5 21.390625 20.328125 13.890625 \n",
       "Q 24.171875 6.390625 31.78125 6.390625 \n",
       "Q 39.453125 6.390625 43.28125 13.890625 \n",
       "Q 47.125 21.390625 47.125 36.375 \n",
       "Q 47.125 51.421875 43.28125 58.90625 \n",
       "Q 39.453125 66.40625 31.78125 66.40625 \n",
       "z\n",
       "M 31.78125 74.21875 \n",
       "Q 44.046875 74.21875 50.515625 64.515625 \n",
       "Q 56.984375 54.828125 56.984375 36.375 \n",
       "Q 56.984375 17.96875 50.515625 8.265625 \n",
       "Q 44.046875 -1.421875 31.78125 -1.421875 \n",
       "Q 19.53125 -1.421875 13.0625 8.265625 \n",
       "Q 6.59375 17.96875 6.59375 36.375 \n",
       "Q 6.59375 54.828125 13.0625 64.515625 \n",
       "Q 19.53125 74.21875 31.78125 74.21875 \n",
       "z\n",
       "\" id=\"DejaVuSans-48\"/>\n",
       "    </defs>\n",
       "    <g transform=\"translate(92.249375 16.318125)scale(0.12 -0.12)\">\n",
       "     <use xlink:href=\"#DejaVuSans-108\"/>\n",
       "     <use x=\"27.783203\" xlink:href=\"#DejaVuSans-97\"/>\n",
       "     <use x=\"89.0625\" xlink:href=\"#DejaVuSans-98\"/>\n",
       "     <use x=\"152.539062\" xlink:href=\"#DejaVuSans-101\"/>\n",
       "     <use x=\"214.0625\" xlink:href=\"#DejaVuSans-108\"/>\n",
       "     <use x=\"241.845703\" xlink:href=\"#DejaVuSans-32\"/>\n",
       "     <use x=\"273.632812\" xlink:href=\"#DejaVuSans-61\"/>\n",
       "     <use x=\"357.421875\" xlink:href=\"#DejaVuSans-32\"/>\n",
       "     <use x=\"389.208984\" xlink:href=\"#DejaVuSans-48\"/>\n",
       "    </g>\n",
       "   </g>\n",
       "  </g>\n",
       " </g>\n",
       " <defs>\n",
       "  <clipPath id=\"pd6dfdd2602\">\n",
       "   <rect height=\"217.44\" width=\"217.44\" x=\"10.7\" y=\"22.318125\"/>\n",
       "  </clipPath>\n",
       " </defs>\n",
       "</svg>\n"
      ],
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
       "  \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
       "<!-- Created with matplotlib (https://matplotlib.org/) -->\n",
       "<svg height=\"250.458125pt\" version=\"1.1\" viewBox=\"0 0 235.34 250.458125\" width=\"235.34pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       " <defs>\n",
       "  <style type=\"text/css\">\n",
       "*{stroke-linecap:butt;stroke-linejoin:round;}\n",
       "  </style>\n",
       " </defs>\n",
       " <g id=\"figure_1\">\n",
       "  <g id=\"patch_1\">\n",
       "   <path d=\"M 0 250.458125 \n",
       "L 235.34 250.458125 \n",
       "L 235.34 0 \n",
       "L 0 0 \n",
       "z\n",
       "\" style=\"fill:none;\"/>\n",
       "  </g>\n",
       "  <g id=\"axes_1\">\n",
       "   <g id=\"patch_2\">\n",
       "    <path d=\"M 10.7 239.758125 \n",
       "L 228.14 239.758125 \n",
       "L 228.14 22.318125 \n",
       "L 10.7 22.318125 \n",
       "z\n",
       "\" style=\"fill:#ffffff;\"/>\n",
       "   </g>\n",
       "   <g clip-path=\"url(#pd488cdca80)\">\n",
       "    <image height=\"218\" id=\"image4bec482923\" transform=\"scale(1 -1)translate(0 -218)\" width=\"218\" x=\"10.7\" xlink:href=\"data:image/png;base64,\n",
       "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\" y=\"-21.758125\"/>\n",
       "   </g>\n",
       "   <g id=\"matplotlib.axis_1\"/>\n",
       "   <g id=\"matplotlib.axis_2\"/>\n",
       "   <g id=\"patch_3\">\n",
       "    <path d=\"M 10.7 239.758125 \n",
       "L 10.7 22.318125 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_4\">\n",
       "    <path d=\"M 228.14 239.758125 \n",
       "L 228.14 22.318125 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_5\">\n",
       "    <path d=\"M 10.7 239.758125 \n",
       "L 228.14 239.758125 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_6\">\n",
       "    <path d=\"M 10.7 22.318125 \n",
       "L 228.14 22.318125 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"text_1\">\n",
       "    <!-- label = 0 -->\n",
       "    <defs>\n",
       "     <path d=\"M 9.421875 75.984375 \n",
       "L 18.40625 75.984375 \n",
       "L 18.40625 0 \n",
       "L 9.421875 0 \n",
       "z\n",
       "\" id=\"DejaVuSans-108\"/>\n",
       "     <path d=\"M 34.28125 27.484375 \n",
       "Q 23.390625 27.484375 19.1875 25 \n",
       "Q 14.984375 22.515625 14.984375 16.5 \n",
       "Q 14.984375 11.71875 18.140625 8.90625 \n",
       "Q 21.296875 6.109375 26.703125 6.109375 \n",
       "Q 34.1875 6.109375 38.703125 11.40625 \n",
       "Q 43.21875 16.703125 43.21875 25.484375 \n",
       "L 43.21875 27.484375 \n",
       "z\n",
       "M 52.203125 31.203125 \n",
       "L 52.203125 0 \n",
       "L 43.21875 0 \n",
       "L 43.21875 8.296875 \n",
       "Q 40.140625 3.328125 35.546875 0.953125 \n",
       "Q 30.953125 -1.421875 24.3125 -1.421875 \n",
       "Q 15.921875 -1.421875 10.953125 3.296875 \n",
       "Q 6 8.015625 6 15.921875 \n",
       "Q 6 25.140625 12.171875 29.828125 \n",
       "Q 18.359375 34.515625 30.609375 34.515625 \n",
       "L 43.21875 34.515625 \n",
       "L 43.21875 35.40625 \n",
       "Q 43.21875 41.609375 39.140625 45 \n",
       "Q 35.0625 48.390625 27.6875 48.390625 \n",
       "Q 23 48.390625 18.546875 47.265625 \n",
       "Q 14.109375 46.140625 10.015625 43.890625 \n",
       "L 10.015625 52.203125 \n",
       "Q 14.9375 54.109375 19.578125 55.046875 \n",
       "Q 24.21875 56 28.609375 56 \n",
       "Q 40.484375 56 46.34375 49.84375 \n",
       "Q 52.203125 43.703125 52.203125 31.203125 \n",
       "z\n",
       "\" id=\"DejaVuSans-97\"/>\n",
       "     <path d=\"M 48.6875 27.296875 \n",
       "Q 48.6875 37.203125 44.609375 42.84375 \n",
       "Q 40.53125 48.484375 33.40625 48.484375 \n",
       "Q 26.265625 48.484375 22.1875 42.84375 \n",
       "Q 18.109375 37.203125 18.109375 27.296875 \n",
       "Q 18.109375 17.390625 22.1875 11.75 \n",
       "Q 26.265625 6.109375 33.40625 6.109375 \n",
       "Q 40.53125 6.109375 44.609375 11.75 \n",
       "Q 48.6875 17.390625 48.6875 27.296875 \n",
       "z\n",
       "M 18.109375 46.390625 \n",
       "Q 20.953125 51.265625 25.265625 53.625 \n",
       "Q 29.59375 56 35.59375 56 \n",
       "Q 45.5625 56 51.78125 48.09375 \n",
       "Q 58.015625 40.1875 58.015625 27.296875 \n",
       "Q 58.015625 14.40625 51.78125 6.484375 \n",
       "Q 45.5625 -1.421875 35.59375 -1.421875 \n",
       "Q 29.59375 -1.421875 25.265625 0.953125 \n",
       "Q 20.953125 3.328125 18.109375 8.203125 \n",
       "L 18.109375 0 \n",
       "L 9.078125 0 \n",
       "L 9.078125 75.984375 \n",
       "L 18.109375 75.984375 \n",
       "z\n",
       "\" id=\"DejaVuSans-98\"/>\n",
       "     <path d=\"M 56.203125 29.59375 \n",
       "L 56.203125 25.203125 \n",
       "L 14.890625 25.203125 \n",
       "Q 15.484375 15.921875 20.484375 11.0625 \n",
       "Q 25.484375 6.203125 34.421875 6.203125 \n",
       "Q 39.59375 6.203125 44.453125 7.46875 \n",
       "Q 49.3125 8.734375 54.109375 11.28125 \n",
       "L 54.109375 2.78125 \n",
       "Q 49.265625 0.734375 44.1875 -0.34375 \n",
       "Q 39.109375 -1.421875 33.890625 -1.421875 \n",
       "Q 20.796875 -1.421875 13.15625 6.1875 \n",
       "Q 5.515625 13.8125 5.515625 26.8125 \n",
       "Q 5.515625 40.234375 12.765625 48.109375 \n",
       "Q 20.015625 56 32.328125 56 \n",
       "Q 43.359375 56 49.78125 48.890625 \n",
       "Q 56.203125 41.796875 56.203125 29.59375 \n",
       "z\n",
       "M 47.21875 32.234375 \n",
       "Q 47.125 39.59375 43.09375 43.984375 \n",
       "Q 39.0625 48.390625 32.421875 48.390625 \n",
       "Q 24.90625 48.390625 20.390625 44.140625 \n",
       "Q 15.875 39.890625 15.1875 32.171875 \n",
       "z\n",
       "\" id=\"DejaVuSans-101\"/>\n",
       "     <path id=\"DejaVuSans-32\"/>\n",
       "     <path d=\"M 10.59375 45.40625 \n",
       "L 73.1875 45.40625 \n",
       "L 73.1875 37.203125 \n",
       "L 10.59375 37.203125 \n",
       "z\n",
       "M 10.59375 25.484375 \n",
       "L 73.1875 25.484375 \n",
       "L 73.1875 17.1875 \n",
       "L 10.59375 17.1875 \n",
       "z\n",
       "\" id=\"DejaVuSans-61\"/>\n",
       "     <path d=\"M 31.78125 66.40625 \n",
       "Q 24.171875 66.40625 20.328125 58.90625 \n",
       "Q 16.5 51.421875 16.5 36.375 \n",
       "Q 16.5 21.390625 20.328125 13.890625 \n",
       "Q 24.171875 6.390625 31.78125 6.390625 \n",
       "Q 39.453125 6.390625 43.28125 13.890625 \n",
       "Q 47.125 21.390625 47.125 36.375 \n",
       "Q 47.125 51.421875 43.28125 58.90625 \n",
       "Q 39.453125 66.40625 31.78125 66.40625 \n",
       "z\n",
       "M 31.78125 74.21875 \n",
       "Q 44.046875 74.21875 50.515625 64.515625 \n",
       "Q 56.984375 54.828125 56.984375 36.375 \n",
       "Q 56.984375 17.96875 50.515625 8.265625 \n",
       "Q 44.046875 -1.421875 31.78125 -1.421875 \n",
       "Q 19.53125 -1.421875 13.0625 8.265625 \n",
       "Q 6.59375 17.96875 6.59375 36.375 \n",
       "Q 6.59375 54.828125 13.0625 64.515625 \n",
       "Q 19.53125 74.21875 31.78125 74.21875 \n",
       "z\n",
       "\" id=\"DejaVuSans-48\"/>\n",
       "    </defs>\n",
       "    <g transform=\"translate(92.249375 16.318125)scale(0.12 -0.12)\">\n",
       "     <use xlink:href=\"#DejaVuSans-108\"/>\n",
       "     <use x=\"27.783203\" xlink:href=\"#DejaVuSans-97\"/>\n",
       "     <use x=\"89.0625\" xlink:href=\"#DejaVuSans-98\"/>\n",
       "     <use x=\"152.539062\" xlink:href=\"#DejaVuSans-101\"/>\n",
       "     <use x=\"214.0625\" xlink:href=\"#DejaVuSans-108\"/>\n",
       "     <use x=\"241.845703\" xlink:href=\"#DejaVuSans-32\"/>\n",
       "     <use x=\"273.632812\" xlink:href=\"#DejaVuSans-61\"/>\n",
       "     <use x=\"357.421875\" xlink:href=\"#DejaVuSans-32\"/>\n",
       "     <use x=\"389.208984\" xlink:href=\"#DejaVuSans-48\"/>\n",
       "    </g>\n",
       "   </g>\n",
       "  </g>\n",
       " </g>\n",
       " <defs>\n",
       "  <clipPath id=\"pd488cdca80\">\n",
       "   <rect height=\"217.44\" width=\"217.44\" x=\"10.7\" y=\"22.318125\"/>\n",
       "  </clipPath>\n",
       " </defs>\n",
       "</svg>\n"
      ],
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from matplotlib import pyplot as plt\n",
    "\n",
    "\n",
    "def load_image(img_path, size=(32, 32)):\n",
    "    label = 1 if tf.strings.regex_full_match(img_path,\n",
    "                                             \".*/automobile/.*\") else 0\n",
    "    img = tf.io.read_file(img_path)\n",
    "    img = tf.image.decode_jpeg(img)  #注意此处为jpeg格式\n",
    "    img = tf.image.resize(img, size)\n",
    "    return (img, label)\n",
    "\n",
    "\n",
    "%matplotlib inline\n",
    "%config InlineBackend.figure_format = 'svg'\n",
    "for i, (img, label) in enumerate(ds6.map(load_image).take(2)):\n",
    "    plt.figure(i)\n",
    "    plt.imshow((img / 255.0).numpy())\n",
    "    plt.title(\"label = %d\" % label)\n",
    "    plt.xticks([])\n",
    "    plt.yticks([])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-06T08:21:20.406040Z",
     "start_time": "2020-04-06T08:21:20.095311Z"
    }
   },
   "outputs": [],
   "source": [
    "# 从tfrecords文件构建\n",
    "import os\n",
    "import numpy as np\n",
    "\n",
    "\n",
    "# inpath：原始数据路径 \n",
    "# outpath:TFRecord文件输出路径\n",
    "def create_tfrecords(inpath, outpath):\n",
    "    writer = tf.io.TFRecordWriter(outpath)\n",
    "    dirs = os.listdir(inpath)\n",
    "    for index, name in enumerate(dirs):\n",
    "        class_path = inpath + \"/\" + name + \"/\"\n",
    "        for img_name in os.listdir(class_path):\n",
    "            img_path = class_path + img_name\n",
    "            img = tf.io.read_file(img_path)\n",
    "            #img = tf.image.decode_image(img)\n",
    "            #img = tf.image.encode_jpeg(img) #统一成jpeg格式压缩\n",
    "            example = tf.train.Example(features=tf.train.Features(\n",
    "                feature={\n",
    "                    'label':\n",
    "                    tf.train.Feature(int64_list=tf.train.Int64List(\n",
    "                        value=[index])),\n",
    "                    'img_raw':\n",
    "                    tf.train.Feature(bytes_list=tf.train.BytesList(\n",
    "                        value=[img.numpy()]))\n",
    "                }))\n",
    "            writer.write(example.SerializeToString())\n",
    "    writer.close()\n",
    "\n",
    "\n",
    "create_tfrecords(\"datasets/cifar2/test/\", \"datasets/cifar2_test.tfrecords/\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-06T08:22:02.921039Z",
     "start_time": "2020-04-06T08:22:02.487664Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
       "  \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
       "<!-- Created with matplotlib (https://matplotlib.org/) -->\n",
       "<svg height=\"359.178125pt\" version=\"1.1\" viewBox=\"0 0 350.158824 359.178125\" width=\"350.158824pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       " <defs>\n",
       "  <style type=\"text/css\">\n",
       "*{stroke-linecap:butt;stroke-linejoin:round;}\n",
       "  </style>\n",
       " </defs>\n",
       " <g id=\"figure_1\">\n",
       "  <g id=\"patch_1\">\n",
       "   <path d=\"M 0 359.178125 \n",
       "L 350.158824 359.178125 \n",
       "L 350.158824 0 \n",
       "L 0 0 \n",
       "z\n",
       "\" style=\"fill:none;\"/>\n",
       "  </g>\n",
       "  <g id=\"axes_1\">\n",
       "   <g id=\"patch_2\">\n",
       "    <path d=\"M 10.7 118.247537 \n",
       "L 106.629412 118.247537 \n",
       "L 106.629412 22.318125 \n",
       "L 10.7 22.318125 \n",
       "z\n",
       "\" style=\"fill:#ffffff;\"/>\n",
       "   </g>\n",
       "   <g clip-path=\"url(#p39360cf4d5)\">\n",
       "    <image height=\"96\" id=\"image95b7f50182\" transform=\"scale(1 -1)translate(0 -96)\" width=\"96\" x=\"10.7\" xlink:href=\"data:image/png;base64,\n",
       "iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAABHNCSVQICAgIfAhkiAAADllJREFUeJztnclzXFcVxl93v55ntbo1WENLtnHFlhI5JoRKhQQMi7CGAAv+BfYs+VNgwTaLsGNaUFQMBXiIHQfbUWRJljX3PI9s4H4/VYn13dyzOt31ut99fXU+nfOd4QZ++vFPpt5/5c23Nv6nej/70cdGf/b8qdF/+5tfG73Xaxk9nYob3QuMjLq1+abeDuoSL6QXkUjE6PFEwujhcNjo7W7H6NW67vvl812j/+v+50ZvtXRNu902eiqVMno+n9d9k7rvw4cPjZ7N5Iwei8WMvri8ZPQrV64YfTgcGr1Wqxk9N6N7Xbt2zej8SZxYELcBlsUPBrUH7737baO/Pnxl9Hv37hmdsDAeS6fp5fIZoycAKYGw7sXvCWAN/X7f6PVmw+ihUEjfnxMsLC2Njf78xc6l14zHuqbX6xm9WCwafXl1xeiErP29V5deT/gaDAZGr1QqRie03nxD8P7Bh+8b3VmAZXEbYFn8D95/z7xYXV01+p/++Huj7+7KtPPZtNHTGXkF8ajMLZvTNQFf0JGIC478sN7vdLtGHwwEZQG4Tb4vyPKCAaMmk0k8zkTrzM8YnXBUazSNPjOja+bnFoyeSmr9mbw+O9FtvUpFHg7XsLAo74jeztbW20Yvzs7pUTwnVsVtgGXxP/roI/Pi6dMnRt/e/sroNOEMApZEMmr00mzB6OOJYGQwkFcTjer64VjBWgOwEECAls5mjU7v6OjwxOgMyuh1EF4yGXllo4mJOy94RJ2OAj16OMtlwXK1Wjf6ZCK4W18T1Lz9zTtGL5fX9VwB4dfu7oHRnQVYFrcBlsWvVM7Mi88++8zoNE+aZAQeSCYjb2E6lWkzuOP7DHAmnt7n30HAk3fUaLSgKyirVKr6/oBv9NXystHTWXE+leq50atVfbbXUwA1W5Jncudb7xg9lxOUtZqCqUhMcLq0pCButlAy+hAeHZ99NBL8OguwLG4DLIv/ySefmBettryR2YJgZzSWqUajCr4INUdHR/rs7CyuF03d7gpSgkFBRxQ0b72lNRy81neSz0nntLaV1bLR98Db7O3vG317e9voiQTpaHluc3OCoLW1q7rvSFCZSQuOYgk9VyopL6tWk6dEr8n39byFgu7rLMCyuA2wLP7TL78wLzY3N43O7E+rLQgi7HTB4UzBk4ynClKgeuGwPIfRWKZdRSBGOnc00ocz8MTm5sXbpNPyxMZTeBdYZxYBXQHezurKmtHL5bK+B3DHwI3r6dd0r3ZLHqMHaA3heQmzE/zdOwuwLG4DLItPKtX3tR+ttgKfKCjlXp/UsaCpWNR/dgYaYwQjmaxgpN+WR7S3L26EAeBKWRBxZVnBjo9s2s7uS6MTEjc2lIEaDgUpzbaumZkpQJfndnx0inuJX/LBUw2HekbQQl48Lu+I0Eevj8/oLMCyuA2wLP7VtbJ5kU6Jah506e2IxwAVdIGmZvL9/3E+5+fiZM6QUWo2BUdv3JIndmtTMPLVtrJyp6eCiDAyaxu3VIM0t6haHUJiuyUIYlBZqytoaiAYfPDgkdGD4J2+8+Fdo/sMKkG5BwLIBiZTl+rOAiyL2wDL4nfAz4zG+u+cgZnk8vpvHkFynFQzuSBCUGlegc/OrviZGCDrvfc/MHoe3sjDRwoSDw4Pjf7OO6KL50u6nt5FvSYYIQQRdhgY7r96bXTCzqOHj42+tqYMFzNiJawhg1JGlkEO4DWxhspZgGVxG2BZ/EwGmSPwMMmYAoqLJiM3aDCQye/syEuhyR+dyGNZRt1RsSQ+5/xcWarDI2XokinxPDdvyjvK5hRA1RrwuCYKuEIheSaRiJ4lAi8lHlcQykBs6YqCvuVVBYOroL5XVnRNKHR5FTcrrskvkZp2FmBZ3AZYFp/w0u8LUsIRmAmoXQY+kYjgiybGmp+NWwqmEvAKkGjyJuCywxFBRCKtTFMcmaxOR+scA+4YDKZT8tzorQ1GLH3UsywuqKQwmxFnlQDdzZJC8mBM7nd6l9dBUehBOQuwLG4DLIvP2p42KOJmU4HM4aHo4ijo2eVl1eHMoDSRAQhLBA+Pj40+HAt2VlHCV0CV8gA0crcr0+6i3LE4o6aJ4RDX9AULbAZhUn4mj+IBJNmTXUFcvyfIqoMv2t75+tL3CUek9xmQ+kGtx1mAZXEbYFn827dvmxeElE5LGbEW9HpVNDLbMJnEZ1Czu7tndPI86awgK4qgj5XPEwR9haJMmMnuKbom/JDWwGQ9q6ODQXk+rFhmhTaf6+T47NL3mYljANtGxo3ezt0ffN/o9NacBVgWtwGWxR8iyb6ytGj0dPqG0a9fv270nW3993/9WhQuAxxyQevr8nAYTEXj7CNT0Pfshejf/QN9/+07oqCvXdN6woAUtrLSE7tImwvizs4ELy00aDC5f+/vf9M6AVksL+S9yAUdn4qiZ//aaIQ6K8+JVXEbYFn8p0+UdWInOBPu7L1iQFSvy3NgoLEM2rbXVzAVjor+7XTBpYxk8hF4RDfeuGX06zcEiZQIgix6I/v78r6Y9D+vobkDHhRhhJXPsZg8FhYYzMzqt2J/GX+T3V0NEiFXxt/TWYBlcRtgWfw4uJ0Ksle9jqCGs3d2XsqsMmiUyCBL1US1sA8T7qO6OBTV+7OzCpSyxXld42ttI3BHLzC/qNsUpJycymsizzNEhXMwpCCuDA+tVlOwWWspy3Z4Kk+JgdUYFHoQ1DphrYjgsVYRXzSPbKCzAMviNsCy+OuoQK7WxXWwXZSBDHmeHKqL2T81xPVeANQrsl0xJMR9ZI4aZzLV/lBQ0AHNex91O5Uz1RrNYEgIvZ0SKO65ecFmA/T7FDWXLE3sgJomBHWR+WKAxoEeMQSefkS/A7/fWYBlcRtgWfwRamloShF4RwzQ4gmZeSQhGAljXlCrLo+iP1CQNQQypdLIWPVBRx8xayZOaQAPitXR1XN5KcWSYPD5Cw0bGehrvIXlstbZEcSxt+slgjhOdwQ77vWGSMQjEJtizfOLgr4V9KCRs3IWYFncBlgW/+BACfc+aoRSKQVHKdbnoNzOh1dzIUhBz9SzF8+NfnImriYaE3zlUV1crchDiMaV4SrNiyrnoNRWSxDEzNpkKjM/YjCFACoEHun0TB7gi69VZtmH98WsHyGoi3oq0tQM9FIIWnf39P3OAiyL2wDL4rdBLzOr1R8okGniv7wPfoZeUBSBFetwSiXNzzlFFTT7xQZTeWJnp4ICemjdPsag0TuCa1VD/9ccKpwPDpWZOsYakoDZw2NlyuqgrwmtU2TfpkHBThJTFjc23zI6PZ8dUNOffvo7ozsLsCxuAyyLzyTyhVFjiDom8ASmAcHCGLRt0JdHFIY3Mj8verkJXuXsVB5RCh3lMdDUHLIajwrW0mnBWhWDO9odwdTSStnou68U3D24r6R/JqusX7Mj+CrOac25LEaWgZbvtNgHJw/t9m1NTfTD+h3u//MfRn/y+EujOwuwLG4DLIt/giCFgQZHjbGnibNumqBzewMk3wFBJycIguBF8DvZyLA2K3jh3CGWF/oRrZP9WY9RYJCIC9ZKRQVuTNwfn8gjmi0JdgozymTNFsSDeUFxUKGgvMH1q98w+vyiyjuff6WA69Hngp1cXs/oLMCyuA2wLD67yy8eQNO47HovAJPvgw8hNKVB4XYQyLDCmfdq4qQMemIX5kvXBRdM0KfS4l4aDXl0AZzusXFTwdHBoRL3/34mniqO0foTjFPbxywjzq/OZQRx62VNWUyC4/r8gQ4V+uKxCgm2traM7izAsrgNsCyBX/3yF8beGGhwuARL6ciHdBGgkZ9hPQ/TSKSC01nWFGGUGcy80RKkELKG6HHtddC5PxTckcPJ4gyvV68FKUNADbNjTKBzBFkRw13vbCng4skjDfaRYWDswb6GytITcxZgWdwGWJbAz3/8Q2OHDHZYHc1MExPKExyyM0EtELvgyaV04HERvlhLE0ILJxs9ag2Zdq2KZPpEa+sNdGMGepmcnusC1KCQIInq6FRW11+cg62AMY0sYQgwy+aOESZGTgCPvMZZgGVxG2BZAt9795ax2+KcOApC0JSJbEAQ6dxEWiYcQI0NzS2O+T/eFPCFxocY4C6Ie3H4qjfV969cEQ/TacuDSqQUEE0CrGqWPkTTRKHEtllxTayVuniMo76nBdp8gM56BpWjPg8tQuDpObEqbgMsi3/3u5pYGIfZMvhisn7Yw8xkQMcYXlC/rwBqBL5oPMQMIgxBZeATBFw00Jleq8psA/jstItphAN9dmFJ9LKPbFoG2bcugr6wB04MJ4kwOGVQxllDEzaeoJCgXZfHVT2/vJveWYBlcRtgWfw3N9UKeoZaHQ6mIC0cCjCrJT2KyYRs83zyRDTsEXgYnqzB4wILnEYYQFsrKOsmGkn++kjNGh64naVVZaaSafSjwdvp9DnhUGvmrKQYSjEvjD5DnVIY3hpnAVXOtc4+eu4ujLX3nFgVtwGWxX8NWODwDQ6yoLdDjsUPsVaHhyCL/5ktwOvAGHxK0JPncHqMGdQI4po1weMJmjgW5xAwwuNKRQGbnu7brMrb6Q2lN+taQ6Mh6OAEAGYPeaBzEP100bCCuLNTrZmBWAgw6yzAsrgNsCx+AJXJ5RUNL71+Ve2rDLIYmLCKmJmsOhLo9BxS8DQWFnAWGOhfnljKg4FuXFWzwx7OuG+cCI6iIVRux1F3FNf7tYYCokRUf39jTxARzuP8r5CeKxTVb9UK4jAjwEskhvH1CZwki4Ek46F+H2cBlsVtgGXxk8nLz71iyR+TyPSCeAAQz/nisNY+kvts55xHRTFp3go63BcXdQ3p67/8+Q9GfxXBAdMJQU0ojPH1gKOdl4ICNPF7gwHScglm5dBOq6/xphPO3Ma59nlBUAlDSHoJwVomowDTWYBlcRtgWf4D3ba6teoORTYAAAAASUVORK5CYII=\" y=\"-22.247537\"/>\n",
       "   </g>\n",
       "   <g id=\"matplotlib.axis_1\"/>\n",
       "   <g id=\"matplotlib.axis_2\"/>\n",
       "   <g id=\"patch_3\">\n",
       "    <path d=\"M 10.7 118.247537 \n",
       "L 10.7 22.318125 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_4\">\n",
       "    <path d=\"M 106.629412 118.247537 \n",
       "L 106.629412 22.318125 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_5\">\n",
       "    <path d=\"M 10.7 118.247537 \n",
       "L 106.629412 118.247537 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_6\">\n",
       "    <path d=\"M 10.7 22.318125 \n",
       "L 106.629412 22.318125 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"text_1\">\n",
       "    <!-- label = 1 -->\n",
       "    <defs>\n",
       "     <path d=\"M 9.421875 75.984375 \n",
       "L 18.40625 75.984375 \n",
       "L 18.40625 0 \n",
       "L 9.421875 0 \n",
       "z\n",
       "\" id=\"DejaVuSans-108\"/>\n",
       "     <path d=\"M 34.28125 27.484375 \n",
       "Q 23.390625 27.484375 19.1875 25 \n",
       "Q 14.984375 22.515625 14.984375 16.5 \n",
       "Q 14.984375 11.71875 18.140625 8.90625 \n",
       "Q 21.296875 6.109375 26.703125 6.109375 \n",
       "Q 34.1875 6.109375 38.703125 11.40625 \n",
       "Q 43.21875 16.703125 43.21875 25.484375 \n",
       "L 43.21875 27.484375 \n",
       "z\n",
       "M 52.203125 31.203125 \n",
       "L 52.203125 0 \n",
       "L 43.21875 0 \n",
       "L 43.21875 8.296875 \n",
       "Q 40.140625 3.328125 35.546875 0.953125 \n",
       "Q 30.953125 -1.421875 24.3125 -1.421875 \n",
       "Q 15.921875 -1.421875 10.953125 3.296875 \n",
       "Q 6 8.015625 6 15.921875 \n",
       "Q 6 25.140625 12.171875 29.828125 \n",
       "Q 18.359375 34.515625 30.609375 34.515625 \n",
       "L 43.21875 34.515625 \n",
       "L 43.21875 35.40625 \n",
       "Q 43.21875 41.609375 39.140625 45 \n",
       "Q 35.0625 48.390625 27.6875 48.390625 \n",
       "Q 23 48.390625 18.546875 47.265625 \n",
       "Q 14.109375 46.140625 10.015625 43.890625 \n",
       "L 10.015625 52.203125 \n",
       "Q 14.9375 54.109375 19.578125 55.046875 \n",
       "Q 24.21875 56 28.609375 56 \n",
       "Q 40.484375 56 46.34375 49.84375 \n",
       "Q 52.203125 43.703125 52.203125 31.203125 \n",
       "z\n",
       "\" id=\"DejaVuSans-97\"/>\n",
       "     <path d=\"M 48.6875 27.296875 \n",
       "Q 48.6875 37.203125 44.609375 42.84375 \n",
       "Q 40.53125 48.484375 33.40625 48.484375 \n",
       "Q 26.265625 48.484375 22.1875 42.84375 \n",
       "Q 18.109375 37.203125 18.109375 27.296875 \n",
       "Q 18.109375 17.390625 22.1875 11.75 \n",
       "Q 26.265625 6.109375 33.40625 6.109375 \n",
       "Q 40.53125 6.109375 44.609375 11.75 \n",
       "Q 48.6875 17.390625 48.6875 27.296875 \n",
       "z\n",
       "M 18.109375 46.390625 \n",
       "Q 20.953125 51.265625 25.265625 53.625 \n",
       "Q 29.59375 56 35.59375 56 \n",
       "Q 45.5625 56 51.78125 48.09375 \n",
       "Q 58.015625 40.1875 58.015625 27.296875 \n",
       "Q 58.015625 14.40625 51.78125 6.484375 \n",
       "Q 45.5625 -1.421875 35.59375 -1.421875 \n",
       "Q 29.59375 -1.421875 25.265625 0.953125 \n",
       "Q 20.953125 3.328125 18.109375 8.203125 \n",
       "L 18.109375 0 \n",
       "L 9.078125 0 \n",
       "L 9.078125 75.984375 \n",
       "L 18.109375 75.984375 \n",
       "z\n",
       "\" id=\"DejaVuSans-98\"/>\n",
       "     <path d=\"M 56.203125 29.59375 \n",
       "L 56.203125 25.203125 \n",
       "L 14.890625 25.203125 \n",
       "Q 15.484375 15.921875 20.484375 11.0625 \n",
       "Q 25.484375 6.203125 34.421875 6.203125 \n",
       "Q 39.59375 6.203125 44.453125 7.46875 \n",
       "Q 49.3125 8.734375 54.109375 11.28125 \n",
       "L 54.109375 2.78125 \n",
       "Q 49.265625 0.734375 44.1875 -0.34375 \n",
       "Q 39.109375 -1.421875 33.890625 -1.421875 \n",
       "Q 20.796875 -1.421875 13.15625 6.1875 \n",
       "Q 5.515625 13.8125 5.515625 26.8125 \n",
       "Q 5.515625 40.234375 12.765625 48.109375 \n",
       "Q 20.015625 56 32.328125 56 \n",
       "Q 43.359375 56 49.78125 48.890625 \n",
       "Q 56.203125 41.796875 56.203125 29.59375 \n",
       "z\n",
       "M 47.21875 32.234375 \n",
       "Q 47.125 39.59375 43.09375 43.984375 \n",
       "Q 39.0625 48.390625 32.421875 48.390625 \n",
       "Q 24.90625 48.390625 20.390625 44.140625 \n",
       "Q 15.875 39.890625 15.1875 32.171875 \n",
       "z\n",
       "\" id=\"DejaVuSans-101\"/>\n",
       "     <path id=\"DejaVuSans-32\"/>\n",
       "     <path d=\"M 10.59375 45.40625 \n",
       "L 73.1875 45.40625 \n",
       "L 73.1875 37.203125 \n",
       "L 10.59375 37.203125 \n",
       "z\n",
       "M 10.59375 25.484375 \n",
       "L 73.1875 25.484375 \n",
       "L 73.1875 17.1875 \n",
       "L 10.59375 17.1875 \n",
       "z\n",
       "\" id=\"DejaVuSans-61\"/>\n",
       "     <path d=\"M 12.40625 8.296875 \n",
       "L 28.515625 8.296875 \n",
       "L 28.515625 63.921875 \n",
       "L 10.984375 60.40625 \n",
       "L 10.984375 69.390625 \n",
       "L 28.421875 72.90625 \n",
       "L 38.28125 72.90625 \n",
       "L 38.28125 8.296875 \n",
       "L 54.390625 8.296875 \n",
       "L 54.390625 0 \n",
       "L 12.40625 0 \n",
       "z\n",
       "\" id=\"DejaVuSans-49\"/>\n",
       "    </defs>\n",
       "    <g transform=\"translate(31.494081 16.318125)scale(0.12 -0.12)\">\n",
       "     <use xlink:href=\"#DejaVuSans-108\"/>\n",
       "     <use x=\"27.783203\" xlink:href=\"#DejaVuSans-97\"/>\n",
       "     <use x=\"89.0625\" xlink:href=\"#DejaVuSans-98\"/>\n",
       "     <use x=\"152.539062\" xlink:href=\"#DejaVuSans-101\"/>\n",
       "     <use x=\"214.0625\" xlink:href=\"#DejaVuSans-108\"/>\n",
       "     <use x=\"241.845703\" xlink:href=\"#DejaVuSans-32\"/>\n",
       "     <use x=\"273.632812\" xlink:href=\"#DejaVuSans-61\"/>\n",
       "     <use x=\"357.421875\" xlink:href=\"#DejaVuSans-32\"/>\n",
       "     <use x=\"389.208984\" xlink:href=\"#DejaVuSans-49\"/>\n",
       "    </g>\n",
       "   </g>\n",
       "  </g>\n",
       "  <g id=\"axes_2\">\n",
       "   <g id=\"patch_7\">\n",
       "    <path d=\"M 128.864706 118.247537 \n",
       "L 224.794118 118.247537 \n",
       "L 224.794118 22.318125 \n",
       "L 128.864706 22.318125 \n",
       "z\n",
       "\" style=\"fill:#ffffff;\"/>\n",
       "   </g>\n",
       "   <g clip-path=\"url(#p6d09b4c7fc)\">\n",
       "    <image height=\"96\" id=\"imagefad5d69c93\" transform=\"scale(1 -1)translate(0 -96)\" width=\"96\" x=\"128.864706\" xlink:href=\"data:image/png;base64,\n",
       "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\" y=\"-22.247537\"/>\n",
       "   </g>\n",
       "   <g id=\"matplotlib.axis_3\"/>\n",
       "   <g id=\"matplotlib.axis_4\"/>\n",
       "   <g id=\"patch_8\">\n",
       "    <path d=\"M 128.864706 118.247537 \n",
       "L 128.864706 22.318125 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_9\">\n",
       "    <path d=\"M 224.794118 118.247537 \n",
       "L 224.794118 22.318125 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_10\">\n",
       "    <path d=\"M 128.864706 118.247537 \n",
       "L 224.794118 118.247537 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_11\">\n",
       "    <path d=\"M 128.864706 22.318125 \n",
       "L 224.794118 22.318125 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"text_2\">\n",
       "    <!-- label = 1 -->\n",
       "    <g transform=\"translate(149.658787 16.318125)scale(0.12 -0.12)\">\n",
       "     <use xlink:href=\"#DejaVuSans-108\"/>\n",
       "     <use x=\"27.783203\" xlink:href=\"#DejaVuSans-97\"/>\n",
       "     <use x=\"89.0625\" xlink:href=\"#DejaVuSans-98\"/>\n",
       "     <use x=\"152.539062\" xlink:href=\"#DejaVuSans-101\"/>\n",
       "     <use x=\"214.0625\" xlink:href=\"#DejaVuSans-108\"/>\n",
       "     <use x=\"241.845703\" xlink:href=\"#DejaVuSans-32\"/>\n",
       "     <use x=\"273.632812\" xlink:href=\"#DejaVuSans-61\"/>\n",
       "     <use x=\"357.421875\" xlink:href=\"#DejaVuSans-32\"/>\n",
       "     <use x=\"389.208984\" xlink:href=\"#DejaVuSans-49\"/>\n",
       "    </g>\n",
       "   </g>\n",
       "  </g>\n",
       "  <g id=\"axes_3\">\n",
       "   <g id=\"patch_12\">\n",
       "    <path d=\"M 247.029412 118.247537 \n",
       "L 342.958824 118.247537 \n",
       "L 342.958824 22.318125 \n",
       "L 247.029412 22.318125 \n",
       "z\n",
       "\" style=\"fill:#ffffff;\"/>\n",
       "   </g>\n",
       "   <g clip-path=\"url(#p7ccab00af2)\">\n",
       "    <image height=\"96\" id=\"imaged53af46673\" transform=\"scale(1 -1)translate(0 -96)\" width=\"96\" x=\"247.029412\" xlink:href=\"data:image/png;base64,\n",
       "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\" y=\"-22.247537\"/>\n",
       "   </g>\n",
       "   <g id=\"matplotlib.axis_5\"/>\n",
       "   <g id=\"matplotlib.axis_6\"/>\n",
       "   <g id=\"patch_13\">\n",
       "    <path d=\"M 247.029412 118.247537 \n",
       "L 247.029412 22.318125 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_14\">\n",
       "    <path d=\"M 342.958824 118.247537 \n",
       "L 342.958824 22.318125 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_15\">\n",
       "    <path d=\"M 247.029412 118.247537 \n",
       "L 342.958824 118.247537 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_16\">\n",
       "    <path d=\"M 247.029412 22.318125 \n",
       "L 342.958824 22.318125 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"text_3\">\n",
       "    <!-- label = 0 -->\n",
       "    <defs>\n",
       "     <path d=\"M 31.78125 66.40625 \n",
       "Q 24.171875 66.40625 20.328125 58.90625 \n",
       "Q 16.5 51.421875 16.5 36.375 \n",
       "Q 16.5 21.390625 20.328125 13.890625 \n",
       "Q 24.171875 6.390625 31.78125 6.390625 \n",
       "Q 39.453125 6.390625 43.28125 13.890625 \n",
       "Q 47.125 21.390625 47.125 36.375 \n",
       "Q 47.125 51.421875 43.28125 58.90625 \n",
       "Q 39.453125 66.40625 31.78125 66.40625 \n",
       "z\n",
       "M 31.78125 74.21875 \n",
       "Q 44.046875 74.21875 50.515625 64.515625 \n",
       "Q 56.984375 54.828125 56.984375 36.375 \n",
       "Q 56.984375 17.96875 50.515625 8.265625 \n",
       "Q 44.046875 -1.421875 31.78125 -1.421875 \n",
       "Q 19.53125 -1.421875 13.0625 8.265625 \n",
       "Q 6.59375 17.96875 6.59375 36.375 \n",
       "Q 6.59375 54.828125 13.0625 64.515625 \n",
       "Q 19.53125 74.21875 31.78125 74.21875 \n",
       "z\n",
       "\" id=\"DejaVuSans-48\"/>\n",
       "    </defs>\n",
       "    <g transform=\"translate(267.823493 16.318125)scale(0.12 -0.12)\">\n",
       "     <use xlink:href=\"#DejaVuSans-108\"/>\n",
       "     <use x=\"27.783203\" xlink:href=\"#DejaVuSans-97\"/>\n",
       "     <use x=\"89.0625\" xlink:href=\"#DejaVuSans-98\"/>\n",
       "     <use x=\"152.539062\" xlink:href=\"#DejaVuSans-101\"/>\n",
       "     <use x=\"214.0625\" xlink:href=\"#DejaVuSans-108\"/>\n",
       "     <use x=\"241.845703\" xlink:href=\"#DejaVuSans-32\"/>\n",
       "     <use x=\"273.632812\" xlink:href=\"#DejaVuSans-61\"/>\n",
       "     <use x=\"357.421875\" xlink:href=\"#DejaVuSans-32\"/>\n",
       "     <use x=\"389.208984\" xlink:href=\"#DejaVuSans-48\"/>\n",
       "    </g>\n",
       "   </g>\n",
       "  </g>\n",
       "  <g id=\"axes_4\">\n",
       "   <g id=\"patch_17\">\n",
       "    <path d=\"M 10.7 233.362831 \n",
       "L 106.629412 233.362831 \n",
       "L 106.629412 137.433419 \n",
       "L 10.7 137.433419 \n",
       "z\n",
       "\" style=\"fill:#ffffff;\"/>\n",
       "   </g>\n",
       "   <g clip-path=\"url(#p0d296476e3)\">\n",
       "    <image height=\"96\" id=\"image05e2396930\" transform=\"scale(1 -1)translate(0 -96)\" width=\"96\" x=\"10.7\" xlink:href=\"data:image/png;base64,\n",
       "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\" y=\"-137.362831\"/>\n",
       "   </g>\n",
       "   <g id=\"matplotlib.axis_7\"/>\n",
       "   <g id=\"matplotlib.axis_8\"/>\n",
       "   <g id=\"patch_18\">\n",
       "    <path d=\"M 10.7 233.362831 \n",
       "L 10.7 137.433419 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_19\">\n",
       "    <path d=\"M 106.629412 233.362831 \n",
       "L 106.629412 137.433419 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_20\">\n",
       "    <path d=\"M 10.7 233.362831 \n",
       "L 106.629412 233.362831 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_21\">\n",
       "    <path d=\"M 10.7 137.433419 \n",
       "L 106.629412 137.433419 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"text_4\">\n",
       "    <!-- label = 0 -->\n",
       "    <g transform=\"translate(31.494081 131.433419)scale(0.12 -0.12)\">\n",
       "     <use xlink:href=\"#DejaVuSans-108\"/>\n",
       "     <use x=\"27.783203\" xlink:href=\"#DejaVuSans-97\"/>\n",
       "     <use x=\"89.0625\" xlink:href=\"#DejaVuSans-98\"/>\n",
       "     <use x=\"152.539062\" xlink:href=\"#DejaVuSans-101\"/>\n",
       "     <use x=\"214.0625\" xlink:href=\"#DejaVuSans-108\"/>\n",
       "     <use x=\"241.845703\" xlink:href=\"#DejaVuSans-32\"/>\n",
       "     <use x=\"273.632812\" xlink:href=\"#DejaVuSans-61\"/>\n",
       "     <use x=\"357.421875\" xlink:href=\"#DejaVuSans-32\"/>\n",
       "     <use x=\"389.208984\" xlink:href=\"#DejaVuSans-48\"/>\n",
       "    </g>\n",
       "   </g>\n",
       "  </g>\n",
       "  <g id=\"axes_5\">\n",
       "   <g id=\"patch_22\">\n",
       "    <path d=\"M 128.864706 233.362831 \n",
       "L 224.794118 233.362831 \n",
       "L 224.794118 137.433419 \n",
       "L 128.864706 137.433419 \n",
       "z\n",
       "\" style=\"fill:#ffffff;\"/>\n",
       "   </g>\n",
       "   <g clip-path=\"url(#p3e4ed16411)\">\n",
       "    <image height=\"96\" id=\"image3393d046bb\" transform=\"scale(1 -1)translate(0 -96)\" width=\"96\" x=\"128.864706\" xlink:href=\"data:image/png;base64,\n",
       "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\" y=\"-137.362831\"/>\n",
       "   </g>\n",
       "   <g id=\"matplotlib.axis_9\"/>\n",
       "   <g id=\"matplotlib.axis_10\"/>\n",
       "   <g id=\"patch_23\">\n",
       "    <path d=\"M 128.864706 233.362831 \n",
       "L 128.864706 137.433419 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_24\">\n",
       "    <path d=\"M 224.794118 233.362831 \n",
       "L 224.794118 137.433419 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_25\">\n",
       "    <path d=\"M 128.864706 233.362831 \n",
       "L 224.794118 233.362831 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_26\">\n",
       "    <path d=\"M 128.864706 137.433419 \n",
       "L 224.794118 137.433419 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"text_5\">\n",
       "    <!-- label = 1 -->\n",
       "    <g transform=\"translate(149.658787 131.433419)scale(0.12 -0.12)\">\n",
       "     <use xlink:href=\"#DejaVuSans-108\"/>\n",
       "     <use x=\"27.783203\" xlink:href=\"#DejaVuSans-97\"/>\n",
       "     <use x=\"89.0625\" xlink:href=\"#DejaVuSans-98\"/>\n",
       "     <use x=\"152.539062\" xlink:href=\"#DejaVuSans-101\"/>\n",
       "     <use x=\"214.0625\" xlink:href=\"#DejaVuSans-108\"/>\n",
       "     <use x=\"241.845703\" xlink:href=\"#DejaVuSans-32\"/>\n",
       "     <use x=\"273.632812\" xlink:href=\"#DejaVuSans-61\"/>\n",
       "     <use x=\"357.421875\" xlink:href=\"#DejaVuSans-32\"/>\n",
       "     <use x=\"389.208984\" xlink:href=\"#DejaVuSans-49\"/>\n",
       "    </g>\n",
       "   </g>\n",
       "  </g>\n",
       "  <g id=\"axes_6\">\n",
       "   <g id=\"patch_27\">\n",
       "    <path d=\"M 247.029412 233.362831 \n",
       "L 342.958824 233.362831 \n",
       "L 342.958824 137.433419 \n",
       "L 247.029412 137.433419 \n",
       "z\n",
       "\" style=\"fill:#ffffff;\"/>\n",
       "   </g>\n",
       "   <g clip-path=\"url(#p856d5171ed)\">\n",
       "    <image height=\"96\" id=\"imagea22cbecd08\" transform=\"scale(1 -1)translate(0 -96)\" width=\"96\" x=\"247.029412\" xlink:href=\"data:image/png;base64,\n",
       "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\" y=\"-137.362831\"/>\n",
       "   </g>\n",
       "   <g id=\"matplotlib.axis_11\"/>\n",
       "   <g id=\"matplotlib.axis_12\"/>\n",
       "   <g id=\"patch_28\">\n",
       "    <path d=\"M 247.029412 233.362831 \n",
       "L 247.029412 137.433419 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_29\">\n",
       "    <path d=\"M 342.958824 233.362831 \n",
       "L 342.958824 137.433419 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_30\">\n",
       "    <path d=\"M 247.029412 233.362831 \n",
       "L 342.958824 233.362831 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_31\">\n",
       "    <path d=\"M 247.029412 137.433419 \n",
       "L 342.958824 137.433419 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"text_6\">\n",
       "    <!-- label = 0 -->\n",
       "    <g transform=\"translate(267.823493 131.433419)scale(0.12 -0.12)\">\n",
       "     <use xlink:href=\"#DejaVuSans-108\"/>\n",
       "     <use x=\"27.783203\" xlink:href=\"#DejaVuSans-97\"/>\n",
       "     <use x=\"89.0625\" xlink:href=\"#DejaVuSans-98\"/>\n",
       "     <use x=\"152.539062\" xlink:href=\"#DejaVuSans-101\"/>\n",
       "     <use x=\"214.0625\" xlink:href=\"#DejaVuSans-108\"/>\n",
       "     <use x=\"241.845703\" xlink:href=\"#DejaVuSans-32\"/>\n",
       "     <use x=\"273.632812\" xlink:href=\"#DejaVuSans-61\"/>\n",
       "     <use x=\"357.421875\" xlink:href=\"#DejaVuSans-32\"/>\n",
       "     <use x=\"389.208984\" xlink:href=\"#DejaVuSans-48\"/>\n",
       "    </g>\n",
       "   </g>\n",
       "  </g>\n",
       "  <g id=\"axes_7\">\n",
       "   <g id=\"patch_32\">\n",
       "    <path d=\"M 10.7 348.478125 \n",
       "L 106.629412 348.478125 \n",
       "L 106.629412 252.548713 \n",
       "L 10.7 252.548713 \n",
       "z\n",
       "\" style=\"fill:#ffffff;\"/>\n",
       "   </g>\n",
       "   <g clip-path=\"url(#pa7a93a682d)\">\n",
       "    <image height=\"96\" id=\"image7e31d62846\" transform=\"scale(1 -1)translate(0 -96)\" width=\"96\" x=\"10.7\" xlink:href=\"data:image/png;base64,\n",
       "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\" y=\"-252.478125\"/>\n",
       "   </g>\n",
       "   <g id=\"matplotlib.axis_13\"/>\n",
       "   <g id=\"matplotlib.axis_14\"/>\n",
       "   <g id=\"patch_33\">\n",
       "    <path d=\"M 10.7 348.478125 \n",
       "L 10.7 252.548713 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_34\">\n",
       "    <path d=\"M 106.629412 348.478125 \n",
       "L 106.629412 252.548713 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_35\">\n",
       "    <path d=\"M 10.7 348.478125 \n",
       "L 106.629412 348.478125 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_36\">\n",
       "    <path d=\"M 10.7 252.548713 \n",
       "L 106.629412 252.548713 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"text_7\">\n",
       "    <!-- label = 0 -->\n",
       "    <g transform=\"translate(31.494081 246.548713)scale(0.12 -0.12)\">\n",
       "     <use xlink:href=\"#DejaVuSans-108\"/>\n",
       "     <use x=\"27.783203\" xlink:href=\"#DejaVuSans-97\"/>\n",
       "     <use x=\"89.0625\" xlink:href=\"#DejaVuSans-98\"/>\n",
       "     <use x=\"152.539062\" xlink:href=\"#DejaVuSans-101\"/>\n",
       "     <use x=\"214.0625\" xlink:href=\"#DejaVuSans-108\"/>\n",
       "     <use x=\"241.845703\" xlink:href=\"#DejaVuSans-32\"/>\n",
       "     <use x=\"273.632812\" xlink:href=\"#DejaVuSans-61\"/>\n",
       "     <use x=\"357.421875\" xlink:href=\"#DejaVuSans-32\"/>\n",
       "     <use x=\"389.208984\" xlink:href=\"#DejaVuSans-48\"/>\n",
       "    </g>\n",
       "   </g>\n",
       "  </g>\n",
       "  <g id=\"axes_8\">\n",
       "   <g id=\"patch_37\">\n",
       "    <path d=\"M 128.864706 348.478125 \n",
       "L 224.794118 348.478125 \n",
       "L 224.794118 252.548713 \n",
       "L 128.864706 252.548713 \n",
       "z\n",
       "\" style=\"fill:#ffffff;\"/>\n",
       "   </g>\n",
       "   <g clip-path=\"url(#p53668f1bfd)\">\n",
       "    <image height=\"96\" id=\"image3c98f9beb6\" transform=\"scale(1 -1)translate(0 -96)\" width=\"96\" x=\"128.864706\" xlink:href=\"data:image/png;base64,\n",
       "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\" y=\"-252.478125\"/>\n",
       "   </g>\n",
       "   <g id=\"matplotlib.axis_15\"/>\n",
       "   <g id=\"matplotlib.axis_16\"/>\n",
       "   <g id=\"patch_38\">\n",
       "    <path d=\"M 128.864706 348.478125 \n",
       "L 128.864706 252.548713 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_39\">\n",
       "    <path d=\"M 224.794118 348.478125 \n",
       "L 224.794118 252.548713 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_40\">\n",
       "    <path d=\"M 128.864706 348.478125 \n",
       "L 224.794118 348.478125 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_41\">\n",
       "    <path d=\"M 128.864706 252.548713 \n",
       "L 224.794118 252.548713 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"text_8\">\n",
       "    <!-- label = 0 -->\n",
       "    <g transform=\"translate(149.658787 246.548713)scale(0.12 -0.12)\">\n",
       "     <use xlink:href=\"#DejaVuSans-108\"/>\n",
       "     <use x=\"27.783203\" xlink:href=\"#DejaVuSans-97\"/>\n",
       "     <use x=\"89.0625\" xlink:href=\"#DejaVuSans-98\"/>\n",
       "     <use x=\"152.539062\" xlink:href=\"#DejaVuSans-101\"/>\n",
       "     <use x=\"214.0625\" xlink:href=\"#DejaVuSans-108\"/>\n",
       "     <use x=\"241.845703\" xlink:href=\"#DejaVuSans-32\"/>\n",
       "     <use x=\"273.632812\" xlink:href=\"#DejaVuSans-61\"/>\n",
       "     <use x=\"357.421875\" xlink:href=\"#DejaVuSans-32\"/>\n",
       "     <use x=\"389.208984\" xlink:href=\"#DejaVuSans-48\"/>\n",
       "    </g>\n",
       "   </g>\n",
       "  </g>\n",
       "  <g id=\"axes_9\">\n",
       "   <g id=\"patch_42\">\n",
       "    <path d=\"M 247.029412 348.478125 \n",
       "L 342.958824 348.478125 \n",
       "L 342.958824 252.548713 \n",
       "L 247.029412 252.548713 \n",
       "z\n",
       "\" style=\"fill:#ffffff;\"/>\n",
       "   </g>\n",
       "   <g clip-path=\"url(#p75fa2a7a39)\">\n",
       "    <image height=\"96\" id=\"image82a22854c4\" transform=\"scale(1 -1)translate(0 -96)\" width=\"96\" x=\"247.029412\" xlink:href=\"data:image/png;base64,\n",
       "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\" y=\"-252.478125\"/>\n",
       "   </g>\n",
       "   <g id=\"matplotlib.axis_17\"/>\n",
       "   <g id=\"matplotlib.axis_18\"/>\n",
       "   <g id=\"patch_43\">\n",
       "    <path d=\"M 247.029412 348.478125 \n",
       "L 247.029412 252.548713 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_44\">\n",
       "    <path d=\"M 342.958824 348.478125 \n",
       "L 342.958824 252.548713 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_45\">\n",
       "    <path d=\"M 247.029412 348.478125 \n",
       "L 342.958824 348.478125 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_46\">\n",
       "    <path d=\"M 247.029412 252.548713 \n",
       "L 342.958824 252.548713 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"text_9\">\n",
       "    <!-- label = 1 -->\n",
       "    <g transform=\"translate(267.823493 246.548713)scale(0.12 -0.12)\">\n",
       "     <use xlink:href=\"#DejaVuSans-108\"/>\n",
       "     <use x=\"27.783203\" xlink:href=\"#DejaVuSans-97\"/>\n",
       "     <use x=\"89.0625\" xlink:href=\"#DejaVuSans-98\"/>\n",
       "     <use x=\"152.539062\" xlink:href=\"#DejaVuSans-101\"/>\n",
       "     <use x=\"214.0625\" xlink:href=\"#DejaVuSans-108\"/>\n",
       "     <use x=\"241.845703\" xlink:href=\"#DejaVuSans-32\"/>\n",
       "     <use x=\"273.632812\" xlink:href=\"#DejaVuSans-61\"/>\n",
       "     <use x=\"357.421875\" xlink:href=\"#DejaVuSans-32\"/>\n",
       "     <use x=\"389.208984\" xlink:href=\"#DejaVuSans-49\"/>\n",
       "    </g>\n",
       "   </g>\n",
       "  </g>\n",
       " </g>\n",
       " <defs>\n",
       "  <clipPath id=\"p39360cf4d5\">\n",
       "   <rect height=\"95.929412\" width=\"95.929412\" x=\"10.7\" y=\"22.318125\"/>\n",
       "  </clipPath>\n",
       "  <clipPath id=\"p6d09b4c7fc\">\n",
       "   <rect height=\"95.929412\" width=\"95.929412\" x=\"128.864706\" y=\"22.318125\"/>\n",
       "  </clipPath>\n",
       "  <clipPath id=\"p7ccab00af2\">\n",
       "   <rect height=\"95.929412\" width=\"95.929412\" x=\"247.029412\" y=\"22.318125\"/>\n",
       "  </clipPath>\n",
       "  <clipPath id=\"p0d296476e3\">\n",
       "   <rect height=\"95.929412\" width=\"95.929412\" x=\"10.7\" y=\"137.433419\"/>\n",
       "  </clipPath>\n",
       "  <clipPath id=\"p3e4ed16411\">\n",
       "   <rect height=\"95.929412\" width=\"95.929412\" x=\"128.864706\" y=\"137.433419\"/>\n",
       "  </clipPath>\n",
       "  <clipPath id=\"p856d5171ed\">\n",
       "   <rect height=\"95.929412\" width=\"95.929412\" x=\"247.029412\" y=\"137.433419\"/>\n",
       "  </clipPath>\n",
       "  <clipPath id=\"pa7a93a682d\">\n",
       "   <rect height=\"95.929412\" width=\"95.929412\" x=\"10.7\" y=\"252.548713\"/>\n",
       "  </clipPath>\n",
       "  <clipPath id=\"p53668f1bfd\">\n",
       "   <rect height=\"95.929412\" width=\"95.929412\" x=\"128.864706\" y=\"252.548713\"/>\n",
       "  </clipPath>\n",
       "  <clipPath id=\"p75fa2a7a39\">\n",
       "   <rect height=\"95.929412\" width=\"95.929412\" x=\"247.029412\" y=\"252.548713\"/>\n",
       "  </clipPath>\n",
       " </defs>\n",
       "</svg>\n"
      ],
      "text/plain": [
       "<Figure size 432x432 with 9 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from matplotlib import pyplot as plt\n",
    "\n",
    "\n",
    "def parse_example(proto):\n",
    "    description = {\n",
    "        'img_raw': tf.io.FixedLenFeature([], tf.string),\n",
    "        'label': tf.io.FixedLenFeature([], tf.int64)\n",
    "    }\n",
    "    example = tf.io.parse_single_example(proto, description)\n",
    "    img = tf.image.decode_jpeg(example[\"img_raw\"])  #注意此处为jpeg格式\n",
    "    img = tf.image.resize(img, (32, 32))\n",
    "    label = example[\"label\"]\n",
    "    return (img, label)\n",
    "\n",
    "\n",
    "ds7 = tf.data.TFRecordDataset(\"datasets/cifar2_test.tfrecords\").map(\n",
    "    parse_example).shuffle(3000)\n",
    "\n",
    "%matplotlib inline\n",
    "%config InlineBackend.figure_format = 'svg'\n",
    "plt.figure(figsize=(6, 6))\n",
    "for i, (img, label) in enumerate(ds7.take(9)):\n",
    "    ax = plt.subplot(3, 3, i + 1)\n",
    "    ax.imshow((img / 255.0).numpy())\n",
    "    ax.set_title(\"label = %d\" % label)\n",
    "    ax.set_xticks([])\n",
    "    ax.set_yticks([])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数据处理\n",
    "`Dataset`包含了非常丰富的数据转换功能。\n",
    "\n",
    "- `map`: 将转换函数映射到数据集每一个元素。\n",
    "\n",
    "- `flat_map`: 将转换函数映射到数据集的每一个元素，并将嵌套的`Dataset`压平。\n",
    "\n",
    "- `interleave`: 效果类似`flat_map`,但可以将不同来源的数据夹在一起。\n",
    "\n",
    "- `filter`: 过滤掉某些元素。\n",
    "\n",
    "- `zip`: 将两个长度相同的`Dataset`横向铰合。\n",
    "\n",
    "- `concatenate`: 将两个`Dataset`纵向连接。\n",
    "\n",
    "- `reduce`: 执行归并操作。\n",
    "\n",
    "- `batch` : 构建批次，每次放一个批次。比原始数据增加一个维度。 其逆操作为unbatch。\n",
    "\n",
    "- `padded_batch`: 构建批次，类似`batch`, 但可以填充到相同的形状。\n",
    "\n",
    "- `window` :构建滑动窗口，返回`Dataset of Dataset`.\n",
    "\n",
    "- `shuffle`: 数据顺序重排。\n",
    "\n",
    "- `repeat`: 重复数据若干次，不带参数时，重复无数次。\n",
    "\n",
    "- `shard`: 采样，从某个位置开始隔固定距离采样一个元素。\n",
    "\n",
    "- `take`: 采样，从开始位置取前几个元素。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-05T12:41:54.976836Z",
     "start_time": "2020-04-05T12:41:54.922664Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tf.Tensor([b'hello' b'world'], shape=(2,), dtype=string)\n",
      "tf.Tensor([b'hello' b'China'], shape=(2,), dtype=string)\n",
      "tf.Tensor([b'hello' b'Beijing'], shape=(2,), dtype=string)\n"
     ]
    }
   ],
   "source": [
    "ds = tf.data.Dataset.from_tensor_slices(\n",
    "    [\"hello world\", \"hello China\", \"hello Beijing\"])\n",
    "ds_map = ds.map(lambda x: tf.strings.split(x, \" \"))\n",
    "for x in ds_map:\n",
    "    print(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-05T12:42:26.006256Z",
     "start_time": "2020-04-05T12:42:25.950829Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tf.Tensor(b'hello', shape=(), dtype=string)\n",
      "tf.Tensor(b'world', shape=(), dtype=string)\n",
      "tf.Tensor(b'hello', shape=(), dtype=string)\n",
      "tf.Tensor(b'China', shape=(), dtype=string)\n",
      "tf.Tensor(b'hello', shape=(), dtype=string)\n",
      "tf.Tensor(b'Beijing', shape=(), dtype=string)\n"
     ]
    }
   ],
   "source": [
    "#flat_map:将转换函数映射到数据集的每一个元素，并将嵌套的Dataset压平。\n",
    "\n",
    "ds = tf.data.Dataset.from_tensor_slices(\n",
    "    [\"hello world\", \"hello China\", \"hello Beijing\"])\n",
    "ds_flatmap = ds.flat_map(\n",
    "    lambda x: tf.data.Dataset.from_tensor_slices(tf.strings.split(x, \" \")))\n",
    "for x in ds_flatmap:\n",
    "    print(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-05T12:43:06.233963Z",
     "start_time": "2020-04-05T12:43:06.195907Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tf.Tensor(b'hello', shape=(), dtype=string)\n",
      "tf.Tensor(b'hello', shape=(), dtype=string)\n",
      "tf.Tensor(b'hello', shape=(), dtype=string)\n",
      "tf.Tensor(b'world', shape=(), dtype=string)\n",
      "tf.Tensor(b'China', shape=(), dtype=string)\n",
      "tf.Tensor(b'Beijing', shape=(), dtype=string)\n"
     ]
    }
   ],
   "source": [
    "# interleave: 效果类似flat_map,但可以将不同来源的数据夹在一起。\n",
    "\n",
    "ds = tf.data.Dataset.from_tensor_slices(\n",
    "    [\"hello world\", \"hello China\", \"hello Beijing\"])\n",
    "ds_interleave = ds.interleave(\n",
    "    lambda x: tf.data.Dataset.from_tensor_slices(tf.strings.split(x, \" \")))\n",
    "for x in ds_interleave:\n",
    "    print(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-05T12:43:42.266298Z",
     "start_time": "2020-04-05T12:43:42.240224Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tf.Tensor(b'hello China', shape=(), dtype=string)\n",
      "tf.Tensor(b'hello Beijing', shape=(), dtype=string)\n"
     ]
    }
   ],
   "source": [
    "# filter:过滤掉某些元素。\n",
    "\n",
    "ds = tf.data.Dataset.from_tensor_slices(\n",
    "    [\"hello world\", \"hello China\", \"hello Beijing\"])\n",
    "#找出含有字母a或B的元素\n",
    "ds_filter = ds.filter(lambda x: tf.strings.regex_full_match(x, \".*[a|B].*\"))\n",
    "for x in ds_filter:\n",
    "    print(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-05T12:44:08.463786Z",
     "start_time": "2020-04-05T12:44:08.454191Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 3 6\n",
      "1 4 7\n",
      "2 5 8\n"
     ]
    }
   ],
   "source": [
    "# zip:将两个长度相同的Dataset横向铰合。\n",
    "\n",
    "ds1 = tf.data.Dataset.range(0, 3)\n",
    "ds2 = tf.data.Dataset.range(3, 6)\n",
    "ds3 = tf.data.Dataset.range(6, 9)\n",
    "ds_zip = tf.data.Dataset.zip((ds1, ds2, ds3))\n",
    "for x, y, z in ds_zip:\n",
    "    print(x.numpy(), y.numpy(), z.numpy())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-05T12:44:31.810820Z",
     "start_time": "2020-04-05T12:44:31.802013Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tf.Tensor(0, shape=(), dtype=int64)\n",
      "tf.Tensor(1, shape=(), dtype=int64)\n",
      "tf.Tensor(2, shape=(), dtype=int64)\n",
      "tf.Tensor(3, shape=(), dtype=int64)\n",
      "tf.Tensor(4, shape=(), dtype=int64)\n",
      "tf.Tensor(5, shape=(), dtype=int64)\n"
     ]
    }
   ],
   "source": [
    "# condatenate:将两个Dataset纵向连接。\n",
    "\n",
    "ds1 = tf.data.Dataset.range(0, 3)\n",
    "ds2 = tf.data.Dataset.range(3, 6)\n",
    "ds_concat = tf.data.Dataset.concatenate(ds1, ds2)\n",
    "for x in ds_concat:\n",
    "    print(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-05T12:44:50.259049Z",
     "start_time": "2020-04-05T12:44:50.234490Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<tf.Tensor: id=4814, shape=(), dtype=float32, numpy=15.0>"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# reduce:执行归并操作。\n",
    "\n",
    "ds = tf.data.Dataset.from_tensor_slices([1, 2, 3, 4, 5.0])\n",
    "result = ds.reduce(0.0, lambda x, y: tf.add(x, y))\n",
    "result"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-05T12:45:07.574035Z",
     "start_time": "2020-04-05T12:45:07.569424Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tf.Tensor([0 1 2 3], shape=(4,), dtype=int64)\n",
      "tf.Tensor([4 5 6 7], shape=(4,), dtype=int64)\n",
      "tf.Tensor([ 8  9 10 11], shape=(4,), dtype=int64)\n"
     ]
    }
   ],
   "source": [
    "# batch:构建批次，每次放一个批次。比原始数据增加一个维度。 其逆操作为unbatch。\n",
    "\n",
    "ds = tf.data.Dataset.range(12)\n",
    "ds_batch = ds.batch(4)\n",
    "for x in ds_batch:\n",
    "    print(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-05T12:45:21.897475Z",
     "start_time": "2020-04-05T12:45:21.876677Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tf.Tensor(\n",
      "[[1 2 0 0]\n",
      " [3 4 5 0]], shape=(2, 4), dtype=int32)\n",
      "tf.Tensor(\n",
      "[[6 7 0 0]\n",
      " [8 0 0 0]], shape=(2, 4), dtype=int32)\n"
     ]
    }
   ],
   "source": [
    "# padded_batch:构建批次，类似batch, 但可以填充到相同的形状。\n",
    "\n",
    "elements = [[1, 2], [3, 4, 5], [6, 7], [8]]\n",
    "ds = tf.data.Dataset.from_generator(lambda: iter(elements), tf.int32)\n",
    "\n",
    "ds_padded_batch = ds.padded_batch(2, padded_shapes=[\n",
    "    4,\n",
    "])\n",
    "for x in ds_padded_batch:\n",
    "    print(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-05T12:46:09.408886Z",
     "start_time": "2020-04-05T12:46:09.390848Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:Entity <function <lambda> at 0x7f4638051680> could not be transformed and will be executed as-is. Please report this to the AutoGraph team. When filing the bug, set the verbosity to 10 (on Linux, `export AUTOGRAPH_VERBOSITY=10`) and attach the full output. Cause: Failed to parse source code of <function <lambda> at 0x7f4638051680>, which Python reported as:\n",
      "    3, shift=1).flat_map(lambda x: x.batch(3, drop_remainder=True))\n",
      "\n",
      "If this is a lambda function, the error may be avoided by creating the lambda in a standalone statement.\n",
      "WARNING: Entity <function <lambda> at 0x7f4638051680> could not be transformed and will be executed as-is. Please report this to the AutoGraph team. When filing the bug, set the verbosity to 10 (on Linux, `export AUTOGRAPH_VERBOSITY=10`) and attach the full output. Cause: Failed to parse source code of <function <lambda> at 0x7f4638051680>, which Python reported as:\n",
      "    3, shift=1).flat_map(lambda x: x.batch(3, drop_remainder=True))\n",
      "\n",
      "If this is a lambda function, the error may be avoided by creating the lambda in a standalone statement.\n",
      "tf.Tensor([0 1 2], shape=(3,), dtype=int64)\n",
      "tf.Tensor([1 2 3], shape=(3,), dtype=int64)\n",
      "tf.Tensor([2 3 4], shape=(3,), dtype=int64)\n",
      "tf.Tensor([3 4 5], shape=(3,), dtype=int64)\n",
      "tf.Tensor([4 5 6], shape=(3,), dtype=int64)\n",
      "tf.Tensor([5 6 7], shape=(3,), dtype=int64)\n",
      "tf.Tensor([6 7 8], shape=(3,), dtype=int64)\n",
      "tf.Tensor([7 8 9], shape=(3,), dtype=int64)\n",
      "tf.Tensor([ 8  9 10], shape=(3,), dtype=int64)\n",
      "tf.Tensor([ 9 10 11], shape=(3,), dtype=int64)\n"
     ]
    }
   ],
   "source": [
    "#window:构建滑动窗口，返回Dataset of Dataset.\n",
    "\n",
    "ds = tf.data.Dataset.range(12)\n",
    "#window返回的是Dataset of Dataset,可以用flat_map压平\n",
    "ds_window = ds.window(\n",
    "    3, shift=1).flat_map(lambda x: x.batch(3, drop_remainder=True))\n",
    "for x in ds_window:\n",
    "    print(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-05T12:46:43.909412Z",
     "start_time": "2020-04-05T12:46:43.900563Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tf.Tensor(2, shape=(), dtype=int64)\n",
      "tf.Tensor(5, shape=(), dtype=int64)\n",
      "tf.Tensor(4, shape=(), dtype=int64)\n",
      "tf.Tensor(6, shape=(), dtype=int64)\n",
      "tf.Tensor(0, shape=(), dtype=int64)\n",
      "tf.Tensor(3, shape=(), dtype=int64)\n",
      "tf.Tensor(8, shape=(), dtype=int64)\n",
      "tf.Tensor(10, shape=(), dtype=int64)\n",
      "tf.Tensor(9, shape=(), dtype=int64)\n",
      "tf.Tensor(7, shape=(), dtype=int64)\n",
      "tf.Tensor(1, shape=(), dtype=int64)\n",
      "tf.Tensor(11, shape=(), dtype=int64)\n"
     ]
    }
   ],
   "source": [
    "#shuffle:数据顺序重排。\n",
    "\n",
    "ds = tf.data.Dataset.range(12)\n",
    "ds_shuffle = ds.shuffle(buffer_size=5)\n",
    "for x in ds_shuffle:\n",
    "    print(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-05T12:47:09.916732Z",
     "start_time": "2020-04-05T12:47:09.908835Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tf.Tensor(1, shape=(), dtype=int64)\n",
      "tf.Tensor(4, shape=(), dtype=int64)\n",
      "tf.Tensor(7, shape=(), dtype=int64)\n",
      "tf.Tensor(10, shape=(), dtype=int64)\n"
     ]
    }
   ],
   "source": [
    "#shard:采样，从某个位置开始隔固定距离采样一个元素。\n",
    "\n",
    "ds = tf.data.Dataset.range(12)\n",
    "ds_shard = ds.shard(3, index=1)\n",
    "\n",
    "for x in ds_shard:\n",
    "    print(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-05T12:49:25.290521Z",
     "start_time": "2020-04-05T12:49:25.282493Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tf.Tensor(0, shape=(), dtype=int64)\n",
      "tf.Tensor(1, shape=(), dtype=int64)\n",
      "tf.Tensor(2, shape=(), dtype=int64)\n"
     ]
    }
   ],
   "source": [
    "#take:采样，从开始位置取前几个元素。\n",
    "ds = tf.data.Dataset.range(12)\n",
    "ds_take = ds.take(3)\n",
    "\n",
    "for x in ds_take:\n",
    "    print(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 提升性能\n",
    "模型训练的耗时主要来自于两个部分，一部分来自数据准备，另一部分来自参数迭代。\n",
    "- 参数迭代过程的耗时通常依赖于GPU来提升。\n",
    "- 而数据准备过程的耗时则可以通过构建高效的数据管道进行提升。\n",
    "\n",
    "以下是一些构建高效数据管道的建议：\n",
    "- 使用 `prefetch` 方法让数据准备和参数迭代两个过程相互并行。\n",
    "- 使用 `interleave` 方法可以让数据读取过程多进程执行,并将不同来源数据夹在一起。\n",
    "- 使用 `map` 时设置`num_parallel_calls` 让数据转换过程多进程执行。\n",
    "- 使用 `cache` 方法让数据在第一个`epoch`后缓存到内存中，仅限于数据集不大的情形。\n",
    "- 使用 `map转换时`，先`batch`, 然后采用向量化的转换方法对每个`batch`进行转换。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-06T08:28:10.411438Z",
     "start_time": "2020-04-06T08:28:10.404325Z"
    }
   },
   "outputs": [],
   "source": [
    "# prefetch 让数据准备和参数迭代两个过程相互并行\n",
    "\n",
    "import tensorflow as tf\n",
    "\n",
    "# 辅助函数，打印时间\n",
    "@tf.function\n",
    "def printbar():\n",
    "    ts = tf.timestamp()\n",
    "    today_ts = ts % (24 * 60 * 60)\n",
    "\n",
    "    hour = tf.cast(today_ts // 3600 + 8, tf.int32) % tf.constant(24)\n",
    "    minite = tf.cast((today_ts % 3600) // 60, tf.int32)\n",
    "    second = tf.cast(tf.floor(today_ts % 60), tf.int32)\n",
    "\n",
    "    def timeformat(m):\n",
    "        if tf.strings.length(tf.strings.format(\"{}\", m)) == 1:\n",
    "            return (tf.strings.format(\"0{}\", m))\n",
    "        else:\n",
    "            return (tf.strings.format(\"{}\", m))\n",
    "\n",
    "    timestring = tf.strings.join(\n",
    "        [timeformat(hour),\n",
    "         timeformat(minite),\n",
    "         timeformat(second)],\n",
    "        separator=\":\")\n",
    "    tf.print(\"==========\" * 8, end=\"\")\n",
    "    tf.print(timestring)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-06T08:31:14.222073Z",
     "start_time": "2020-04-06T08:31:14.209200Z"
    }
   },
   "outputs": [],
   "source": [
    "import time\n",
    "\n",
    "\n",
    "def generator():\n",
    "    for i in range(10):\n",
    "        # 假设每次准备数据需要2s\n",
    "        time.sleep(2)\n",
    "        yield i\n",
    "\n",
    "\n",
    "ds = tf.data.Dataset.from_generator(generator, output_types=tf.int32)\n",
    "\n",
    "\n",
    "def train_step():\n",
    "    # 假设每一步训练需要1s\n",
    "    time.sleep(1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-06T08:33:48.654989Z",
     "start_time": "2020-04-06T08:33:18.212861Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "================================================================================16:33:18\n",
      "start training...\n",
      "================================================================================16:33:48\n",
      "end training...\n"
     ]
    }
   ],
   "source": [
    "# 普通训练时间 10*2+10*1 = 30\n",
    "printbar()\n",
    "tf.print(tf.constant(\"start training...\"))\n",
    "\n",
    "for x in ds:\n",
    "    train_step()\n",
    "    \n",
    "printbar()\n",
    "tf.print(tf.constant(\"end training...\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-06T08:35:42.445941Z",
     "start_time": "2020-04-06T08:35:21.294471Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "================================================================================16:35:21\n",
      "start training...\n",
      "================================================================================16:35:42\n",
      "end training...\n"
     ]
    }
   ],
   "source": [
    "# 使用 prefetch 方法让数据准备和参数迭代两个过程相互并行。\n",
    "\n",
    "# 训练过程预计耗时 max(10*2,10*1) = 20s\n",
    "\n",
    "printbar()\n",
    "tf.print(tf.constant(\"start training...\"))\n",
    "\n",
    "for x in ds.prefetch(buffer_size=tf.data.experimental.AUTOTUNE):\n",
    "    train_step()\n",
    "    \n",
    "printbar()\n",
    "tf.print(tf.constant(\"end training...\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-06T08:37:47.235218Z",
     "start_time": "2020-04-06T08:37:47.111164Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tf.Tensor(b'181,0,3,\"Sage, Miss. Constance Gladys\",female,,8,2,CA. 2343,69.55,,S', shape=(), dtype=string)\n",
      "tf.Tensor(b'405,0,3,\"Oreskovic, Miss. Marija\",female,20.0,0,0,315096,8.6625,,S', shape=(), dtype=string)\n",
      "tf.Tensor(b'635,0,3,\"Skoog, Miss. Mabel\",female,9.0,3,2,347088,27.9,,S', shape=(), dtype=string)\n",
      "tf.Tensor(b'701,1,1,\"Astor, Mrs. John Jacob (Madeleine Talmadge Force)\",female,18.0,1,0,PC 17757,227.525,C62 C64,C', shape=(), dtype=string)\n"
     ]
    }
   ],
   "source": [
    "# 使用 interleave 方法可以让数据读取过程多进程执行,并将不同来源数据夹在一起\n",
    "\n",
    "ds_files = tf.data.Dataset.list_files(\"datasets/titanic/*.csv\")\n",
    "ds = ds_files.flat_map(lambda x: tf.data.TextLineDataset(x).skip(1))\n",
    "for line in ds.take(4):\n",
    "    print(line)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-06T08:38:10.800603Z",
     "start_time": "2020-04-06T08:38:10.660844Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tf.Tensor(b'493,0,1,\"Molson, Mr. Harry Markland\",male,55.0,0,0,113787,30.5,C30,S', shape=(), dtype=string)\n",
      "tf.Tensor(b'181,0,3,\"Sage, Miss. Constance Gladys\",female,,8,2,CA. 2343,69.55,,S', shape=(), dtype=string)\n",
      "tf.Tensor(b'53,1,1,\"Harper, Mrs. Henry Sleeper (Myna Haxtun)\",female,49.0,1,0,PC 17572,76.7292,D33,C', shape=(), dtype=string)\n",
      "tf.Tensor(b'405,0,3,\"Oreskovic, Miss. Marija\",female,20.0,0,0,315096,8.6625,,S', shape=(), dtype=string)\n",
      "tf.Tensor(b'388,1,2,\"Buss, Miss. Kate\",female,36.0,0,0,27849,13.0,,S', shape=(), dtype=string)\n",
      "tf.Tensor(b'635,0,3,\"Skoog, Miss. Mabel\",female,9.0,3,2,347088,27.9,,S', shape=(), dtype=string)\n",
      "tf.Tensor(b'192,0,2,\"Carbines, Mr. William\",male,19.0,0,0,28424,13.0,,S', shape=(), dtype=string)\n",
      "tf.Tensor(b'701,1,1,\"Astor, Mrs. John Jacob (Madeleine Talmadge Force)\",female,18.0,1,0,PC 17757,227.525,C62 C64,C', shape=(), dtype=string)\n"
     ]
    }
   ],
   "source": [
    "ds_files = tf.data.Dataset.list_files(\"datasets/titanic/*.csv\")\n",
    "ds = ds_files.interleave(lambda x: tf.data.TextLineDataset(x).skip(1))\n",
    "for line in ds.take(8):\n",
    "    print(line)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-06T08:38:58.613940Z",
     "start_time": "2020-04-06T08:38:58.479890Z"
    }
   },
   "outputs": [],
   "source": [
    "# 使用 map 时设置num_parallel_calls 让数据转换过程多进行执行。\n",
    "\n",
    "ds = tf.data.Dataset.list_files(\"datasets/cifar2/train/*/*.jpg\")\n",
    "\n",
    "\n",
    "def load_image(img_path, size=(32, 32)):\n",
    "    label = 1 if tf.strings.regex_full_match(img_path,\n",
    "                                             \".*/automobile/.*\") else 0\n",
    "    img = tf.io.read_file(img_path)\n",
    "    img = tf.image.decode_jpeg(img)  #注意此处为jpeg格式\n",
    "    img = tf.image.resize(img, size)\n",
    "    return (img, label)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-06T08:39:13.967349Z",
     "start_time": "2020-04-06T08:39:11.791765Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "================================================================================16:39:11\n",
      "start transformation...\n",
      "================================================================================16:39:13\n",
      "end transformation...\n"
     ]
    }
   ],
   "source": [
    "#单进程转换\n",
    "printbar()\n",
    "tf.print(tf.constant(\"start transformation...\"))\n",
    "\n",
    "ds_map = ds.map(load_image)\n",
    "for _ in ds_map:\n",
    "    pass\n",
    "\n",
    "printbar()\n",
    "tf.print(tf.constant(\"end transformation...\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-06T08:39:35.128372Z",
     "start_time": "2020-04-06T08:39:34.319181Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "================================================================================16:39:34\n",
      "start parallel transformation...\n",
      "================================================================================16:39:35\n",
      "end parallel transformation...\n"
     ]
    }
   ],
   "source": [
    "#多进程转换\n",
    "printbar()\n",
    "tf.print(tf.constant(\"start parallel transformation...\"))\n",
    "\n",
    "ds_map_parallel = ds.map(load_image,\n",
    "                         num_parallel_calls=tf.data.experimental.AUTOTUNE)\n",
    "for _ in ds_map_parallel:\n",
    "    pass\n",
    "\n",
    "printbar()\n",
    "tf.print(tf.constant(\"end parallel transformation...\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-06T08:41:04.534302Z",
     "start_time": "2020-04-06T08:40:34.325251Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "================================================================================16:40:34\n",
      "start training...\n",
      "================================================================================16:40:44\n",
      "epoch = 0  ended\n",
      "================================================================================16:40:54\n",
      "epoch = 1  ended\n",
      "================================================================================16:41:04\n",
      "epoch = 2  ended\n",
      "================================================================================16:41:04\n",
      "end training...\n"
     ]
    }
   ],
   "source": [
    "# 使用 cache 方法让数据在第一个epoch后缓存到内存中，仅限于数据集不大情形。\n",
    "\n",
    "import time\n",
    "\n",
    "\n",
    "# 模拟数据准备\n",
    "def generator():\n",
    "    for i in range(5):\n",
    "        #假设每次准备数据需要2s\n",
    "        time.sleep(2)\n",
    "        yield i\n",
    "\n",
    "\n",
    "ds = tf.data.Dataset.from_generator(generator, output_types=(tf.int32))\n",
    "\n",
    "\n",
    "# 模拟参数迭代\n",
    "def train_step():\n",
    "    #假设每一步训练需要0s\n",
    "    pass\n",
    "\n",
    "\n",
    "# 训练过程预计耗时 (5*2+5*0)*3 = 30s\n",
    "printbar()\n",
    "tf.print(tf.constant(\"start training...\"))\n",
    "\n",
    "for epoch in tf.range(3):\n",
    "    for x in ds:\n",
    "        train_step()\n",
    "        \n",
    "    printbar()\n",
    "    tf.print(\"epoch =\", epoch, \" ended\")\n",
    "    \n",
    "printbar()\n",
    "tf.print(tf.constant(\"end training...\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-06T08:41:22.170334Z",
     "start_time": "2020-04-06T08:41:12.112681Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "================================================================================16:41:12\n",
      "start training...\n",
      "================================================================================16:41:22\n",
      "epoch = 0  ended\n",
      "================================================================================16:41:22\n",
      "epoch = 1  ended\n",
      "================================================================================16:41:22\n",
      "epoch = 2  ended\n",
      "================================================================================16:41:22\n",
      "end training...\n"
     ]
    }
   ],
   "source": [
    "import time\n",
    "\n",
    "\n",
    "# 模拟数据准备\n",
    "def generator():\n",
    "    for i in range(5):\n",
    "        #假设每次准备数据需要2s\n",
    "        time.sleep(2)\n",
    "        yield i\n",
    "\n",
    "\n",
    "# 使用 cache 方法让数据在第一个epoch后缓存到内存中，仅限于数据集不大情形。\n",
    "ds = tf.data.Dataset.from_generator(generator, output_types=(tf.int32)).cache()\n",
    "\n",
    "\n",
    "# 模拟参数迭代\n",
    "def train_step():\n",
    "    #假设每一步训练需要0s\n",
    "    time.sleep(0)\n",
    "\n",
    "\n",
    "# 训练过程预计耗时 (5*2+5*0)+(5*0+5*0)*2 = 10s\n",
    "printbar()\n",
    "tf.print(tf.constant(\"start training...\"))\n",
    "for epoch in tf.range(3):\n",
    "    for x in ds:\n",
    "        train_step()\n",
    "    printbar()\n",
    "    tf.print(\"epoch =\", epoch, \" ended\")\n",
    "printbar()\n",
    "tf.print(tf.constant(\"end training...\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-06T08:44:35.696004Z",
     "start_time": "2020-04-06T08:44:22.684859Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "================================================================================16:44:22\n",
      "start scalar transformation...\n",
      "================================================================================16:44:35\n",
      "end scalar transformation...\n"
     ]
    }
   ],
   "source": [
    "# 使用 map转换时，先batch, 然后采用向量化的转换方法对每个batch进行转换。\n",
    "\n",
    "#先map后batch\n",
    "ds = tf.data.Dataset.range(1000000)\n",
    "ds_map_batch = ds.map(lambda x: x**2).batch(20)\n",
    "\n",
    "printbar()\n",
    "tf.print(tf.constant(\"start scalar transformation...\"))\n",
    "\n",
    "for x in ds_map_batch:\n",
    "    pass\n",
    "\n",
    "printbar()\n",
    "tf.print(tf.constant(\"end scalar transformation...\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-06T08:44:44.757129Z",
     "start_time": "2020-04-06T08:44:41.732522Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "================================================================================16:44:41\n",
      "start vector transformation...\n",
      "================================================================================16:44:44\n",
      "end vector transformation...\n"
     ]
    }
   ],
   "source": [
    "#先batch后map\n",
    "ds = tf.data.Dataset.range(1000000)\n",
    "ds_batch_map = ds.batch(20).map(lambda x:x**2)\n",
    "\n",
    "printbar()\n",
    "tf.print(tf.constant(\"start vector transformation...\"))\n",
    "\n",
    "for x in ds_batch_map:\n",
    "    pass\n",
    "\n",
    "printbar()\n",
    "tf.print(tf.constant(\"end vector transformation...\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 创建特征\n",
    "- 将类别特征转换为`one-hot`编码，将连续特征构建分桶特征，以及多个特征生成交叉特征等等。\n",
    "- 特征列通常用于对结构化数据实施特征工程时候使用，图像或者文本数据一般不会用到特征列。\n",
    "- `tf.feature_column`:\n",
    "    - `numeric_column` 数值列，最常用。\n",
    "    - `bucketized_column` 分桶列，由数值列生成，可以由一个数值列出多个特征，`one`-hot编码。\n",
    "    - `categorical_column_with_identity` 分类标识列，`one-hot`编码，相当于分桶列每个桶为1个整数的情况。\n",
    "    - `categorical_column_with_vocabulary_list` 分类词汇列，`one-hot`编码，由list指定词典。\n",
    "    - `categorical_column_with_vocabulary_file` 分类词汇列，由文件file指定词典。\n",
    "    - `categorical_column_with_hash_bucket` 哈希列，整数或词典较大时采用。\n",
    "    - `indicator_column` 指标列，由`Categorical Column`生成，`one-hot`编码\n",
    "    - `embedding_column` 嵌入列，由`Categorical Column`生成，嵌入矢量分布参数需要学习。嵌入矢量维数建议取类别数量的 4 次方根。\n",
    "    - `crossed_column` 交叉列，可以由除`categorical_column_with_hash_bucket`的任意分类列构成。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-06T08:54:52.867393Z",
     "start_time": "2020-04-06T08:54:52.861919Z"
    }
   },
   "outputs": [],
   "source": [
    "import datetime\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "from matplotlib import pyplot as plt\n",
    "import tensorflow as tf\n",
    "from tensorflow.keras import layers, models"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-06T08:56:38.235277Z",
     "start_time": "2020-04-06T08:56:38.230245Z"
    }
   },
   "outputs": [],
   "source": [
    "def printlog(info):\n",
    "    nowtime = datetime.datetime.now().strftime(\"%Y-%m-%d %H:%M:%S\")\n",
    "    print(\"\\n\" + \"======\" * 8 + \"%s\" % nowtime)\n",
    "    print(info + \"...\\n\\n\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-06T09:03:17.830683Z",
     "start_time": "2020-04-06T09:03:17.792396Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "================================================2020-04-06 17:03:17\n",
      "step 1: prepare dataset......\n",
      "\n",
      "\n"
     ]
    }
   ],
   "source": [
    "# 一、构建数据管道\n",
    "printlog(\"step 1: prepare dataset...\")\n",
    "\n",
    "dftrain_raw = pd.read_csv(\"datasets/titanic/train.csv\")\n",
    "dftest_raw = pd.read_csv(\"datasets/titanic/test.csv\")\n",
    "\n",
    "dfraw = pd.concat([dftrain_raw, dftest_raw])\n",
    "\n",
    "\n",
    "def prepare_dfdata(dfraw):\n",
    "    dfdata = dfraw.copy()\n",
    "    dfdata.columns = [x.lower() for x in dfdata.columns]\n",
    "    dfdata = dfdata.rename(columns={'survivied': 'label'})\n",
    "    dfdata = dfdata.drop(['passengerid', 'name'], axis=1)\n",
    "    for col, dtype in dict(dfdata.dtypes).items():\n",
    "        # 判断是否包含缺失值\n",
    "        if dfdata[col].hasnans:\n",
    "            # 添加标识是否缺失列\n",
    "            dfdata[col + '_nan'] = pd.isna(dfdata[col]).astype('int32')\n",
    "            # 填充\n",
    "            if dtype not in [np.object, np.str, np.unicode]:\n",
    "                dfdata[col].fillna(dfdata[col].mean(), inplace=True)\n",
    "            else:\n",
    "                dfdata[col].fillna('', inplace=True)\n",
    "    return (dfdata)\n",
    "\n",
    "\n",
    "dfdata = prepare_dfdata(dfraw)\n",
    "dftrain = dfdata.iloc[0:len(dftrain_raw), :]\n",
    "dftest = dfdata.iloc[len(dftrain_raw):, :]\n",
    "\n",
    "\n",
    "# 从 dataframe 导入数据\n",
    "def df_to_dataset(df, shuffle=True, batch_size=32):\n",
    "    dfdata = df.copy()\n",
    "    if 'label' not in dfdata.columns:\n",
    "        ds = tf.data.Dataset.from_tensor_slices(dfdata.to_dict(orient='list'))\n",
    "    else:\n",
    "        labels = dfdata.pop('label')\n",
    "        ds = tf.data.Dataset.from_tensor_slices(\n",
    "            (dfdata.to_dict(orient='list'), labels))\n",
    "    if shuffle:\n",
    "        ds = ds.shuffle(buffer_size=len(dfdata))\n",
    "    ds = ds.batch(batch_size)\n",
    "    return ds\n",
    "\n",
    "\n",
    "ds_train = df_to_dataset(dftrain)\n",
    "ds_test = df_to_dataset(dftest)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-06T09:03:53.640374Z",
     "start_time": "2020-04-06T09:03:53.630938Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "================================================2020-04-06 17:03:53\n",
      "step2: make feature columns......\n",
      "\n",
      "\n"
     ]
    }
   ],
   "source": [
    "# 二，定义特征列\n",
    "#================================================================================\n",
    "printlog(\"step2: make feature columns...\")\n",
    "\n",
    "feature_columns = []\n",
    "\n",
    "# 数值列\n",
    "for col in ['age', 'fare', 'parch', 'sibsp'\n",
    "            ] + [c for c in dfdata.columns if c.endswith('_nan')]:\n",
    "    feature_columns.append(tf.feature_column.numeric_column(col))\n",
    "\n",
    "# 分桶列\n",
    "age = tf.feature_column.numeric_column('age')\n",
    "age_buckets = tf.feature_column.bucketized_column(\n",
    "    age, boundaries=[18, 25, 30, 35, 40, 45, 50, 55, 60, 65])\n",
    "feature_columns.append(age_buckets)\n",
    "\n",
    "# 类别列\n",
    "# 注意：所有的Catogorical Column类型最终都要通过indicator_column转换成Dense Column类型才能传入模型！！\n",
    "sex = tf.feature_column.indicator_column(\n",
    "    tf.feature_column.categorical_column_with_vocabulary_list(\n",
    "        key='sex', vocabulary_list=[\"male\", \"female\"]))\n",
    "feature_columns.append(sex)\n",
    "\n",
    "pclass = tf.feature_column.indicator_column(\n",
    "    tf.feature_column.categorical_column_with_vocabulary_list(\n",
    "        key='pclass', vocabulary_list=[1, 2, 3]))\n",
    "feature_columns.append(pclass)\n",
    "\n",
    "ticket = tf.feature_column.indicator_column(\n",
    "    tf.feature_column.categorical_column_with_hash_bucket('ticket', 3))\n",
    "feature_columns.append(ticket)\n",
    "\n",
    "embarked = tf.feature_column.indicator_column(\n",
    "    tf.feature_column.categorical_column_with_vocabulary_list(\n",
    "        key='embarked', vocabulary_list=['S', 'C', 'B']))\n",
    "feature_columns.append(embarked)\n",
    "\n",
    "# 嵌入列\n",
    "cabin = tf.feature_column.embedding_column(\n",
    "    tf.feature_column.categorical_column_with_hash_bucket('cabin', 32), 2)\n",
    "feature_columns.append(cabin)\n",
    "\n",
    "# 交叉列\n",
    "pclass_cate = tf.feature_column.categorical_column_with_vocabulary_list(\n",
    "    key='pclass', vocabulary_list=[1, 2, 3])\n",
    "\n",
    "crossed_feature = tf.feature_column.indicator_column(\n",
    "    tf.feature_column.crossed_column([age_buckets, pclass_cate],\n",
    "                                     hash_bucket_size=15))\n",
    "\n",
    "feature_columns.append(crossed_feature)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-06T09:04:16.578900Z",
     "start_time": "2020-04-06T09:04:16.568397Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "================================================2020-04-06 17:04:16\n",
      "step3: define model......\n",
      "\n",
      "\n"
     ]
    }
   ],
   "source": [
    "# 三，定义模型\n",
    "#================================================================================\n",
    "printlog(\"step3: define model...\")\n",
    "\n",
    "tf.keras.backend.clear_session()\n",
    "model = tf.keras.Sequential([\n",
    "    layers.DenseFeatures(\n",
    "        feature_columns),  #将特征列放入到tf.keras.layers.DenseFeatures中!!!\n",
    "    layers.Dense(64, activation='relu'),\n",
    "    layers.Dense(64, activation='relu'),\n",
    "    layers.Dense(1, activation='sigmoid')\n",
    "])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-06T09:04:26.384478Z",
     "start_time": "2020-04-06T09:04:25.887251Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "================================================2020-04-06 17:04:25\n",
      "step4: train model......\n",
      "\n",
      "\n",
      "WARNING:tensorflow:From /home/yangbin7/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/feature_column/feature_column_v2.py:4276: IndicatorColumn._variable_shape (from tensorflow.python.feature_column.feature_column_v2) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "The old _FeatureColumn APIs are being deprecated. Please use the new FeatureColumn APIs instead.\n",
      "WARNING:tensorflow:From /home/yangbin7/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/feature_column/feature_column_v2.py:4331: CrossedColumn._num_buckets (from tensorflow.python.feature_column.feature_column_v2) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "The old _FeatureColumn APIs are being deprecated. Please use the new FeatureColumn APIs instead.\n",
      "WARNING:tensorflow:From /home/yangbin7/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/feature_column/feature_column_v2.py:4331: VocabularyListCategoricalColumn._num_buckets (from tensorflow.python.feature_column.feature_column_v2) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "The old _FeatureColumn APIs are being deprecated. Please use the new FeatureColumn APIs instead.\n",
      "WARNING:tensorflow:From /home/yangbin7/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/feature_column/feature_column_v2.py:4331: HashedCategoricalColumn._num_buckets (from tensorflow.python.feature_column.feature_column_v2) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "The old _FeatureColumn APIs are being deprecated. Please use the new FeatureColumn APIs instead.\n",
      "Epoch 1/10\n",
      "      1/Unknown - 0s 109ms/step"
     ]
    },
    {
     "ename": "IndexError",
     "evalue": "list index out of range",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mIndexError\u001b[0m                                Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-43-d5a13bae34a0>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m      7\u001b[0m               metrics=['accuracy'])\n\u001b[1;32m      8\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 9\u001b[0;31m \u001b[0mhistory\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mds_train\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvalidation_data\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mds_test\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mepochs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/training.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_freq, max_queue_size, workers, use_multiprocessing, **kwargs)\u001b[0m\n\u001b[1;32m    726\u001b[0m         \u001b[0mmax_queue_size\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmax_queue_size\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    727\u001b[0m         \u001b[0mworkers\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mworkers\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 728\u001b[0;31m         use_multiprocessing=use_multiprocessing)\n\u001b[0m\u001b[1;32m    729\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    730\u001b[0m   def evaluate(self,\n",
      "\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/training_v2.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, model, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_freq, **kwargs)\u001b[0m\n\u001b[1;32m    322\u001b[0m                 \u001b[0mmode\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mModeKeys\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mTRAIN\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    323\u001b[0m                 \u001b[0mtraining_context\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtraining_context\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 324\u001b[0;31m                 total_epochs=epochs)\n\u001b[0m\u001b[1;32m    325\u001b[0m             \u001b[0mcbks\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmake_logs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mepoch_logs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtraining_result\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mModeKeys\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mTRAIN\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    326\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/training_v2.py\u001b[0m in \u001b[0;36mrun_one_epoch\u001b[0;34m(model, iterator, execution_function, dataset_size, batch_size, strategy, steps_per_epoch, num_samples, mode, training_context, total_epochs)\u001b[0m\n\u001b[1;32m    121\u001b[0m         step=step, mode=mode, size=current_batch_size) as batch_logs:\n\u001b[1;32m    122\u001b[0m       \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 123\u001b[0;31m         \u001b[0mbatch_outs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mexecution_function\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0miterator\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    124\u001b[0m       \u001b[0;32mexcept\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mStopIteration\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0merrors\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mOutOfRangeError\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    125\u001b[0m         \u001b[0;31m# TODO(kaftan): File bug about tf function and errors.OutOfRangeError?\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/training_v2_utils.py\u001b[0m in \u001b[0;36mexecution_function\u001b[0;34m(input_fn)\u001b[0m\n\u001b[1;32m     84\u001b[0m     \u001b[0;31m# `numpy` translates Tensors to values in Eager mode.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     85\u001b[0m     return nest.map_structure(_non_none_constant_value,\n\u001b[0;32m---> 86\u001b[0;31m                               distributed_function(input_fn))\n\u001b[0m\u001b[1;32m     87\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     88\u001b[0m   \u001b[0;32mreturn\u001b[0m \u001b[0mexecution_function\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/eager/def_function.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *args, **kwds)\u001b[0m\n\u001b[1;32m    455\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    456\u001b[0m     \u001b[0mtracing_count\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_tracing_count\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 457\u001b[0;31m     \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_call\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    458\u001b[0m     \u001b[0;32mif\u001b[0m \u001b[0mtracing_count\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_tracing_count\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    459\u001b[0m       \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_call_counter\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcalled_without_tracing\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/eager/def_function.py\u001b[0m in \u001b[0;36m_call\u001b[0;34m(self, *args, **kwds)\u001b[0m\n\u001b[1;32m    501\u001b[0m       \u001b[0;31m# This is the first call of __call__, so we have to initialize.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    502\u001b[0m       \u001b[0minitializer_map\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mobject_identity\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mObjectIdentityDictionary\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 503\u001b[0;31m       \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_initialize\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkwds\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0madd_initializers_to\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0minitializer_map\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    504\u001b[0m     \u001b[0;32mfinally\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    505\u001b[0m       \u001b[0;31m# At this point we know that the initialization is complete (or less\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/eager/def_function.py\u001b[0m in \u001b[0;36m_initialize\u001b[0;34m(self, args, kwds, add_initializers_to)\u001b[0m\n\u001b[1;32m    406\u001b[0m     self._concrete_stateful_fn = (\n\u001b[1;32m    407\u001b[0m         self._stateful_fn._get_concrete_function_internal_garbage_collected(  # pylint: disable=protected-access\n\u001b[0;32m--> 408\u001b[0;31m             *args, **kwds))\n\u001b[0m\u001b[1;32m    409\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    410\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0minvalid_creator_scope\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0munused_args\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0munused_kwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/eager/function.py\u001b[0m in \u001b[0;36m_get_concrete_function_internal_garbage_collected\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m   1846\u001b[0m     \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minput_signature\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1847\u001b[0m       \u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkwargs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1848\u001b[0;31m     \u001b[0mgraph_function\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_maybe_define_function\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1849\u001b[0m     \u001b[0;32mreturn\u001b[0m \u001b[0mgraph_function\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1850\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/eager/function.py\u001b[0m in \u001b[0;36m_maybe_define_function\u001b[0;34m(self, args, kwargs)\u001b[0m\n\u001b[1;32m   2148\u001b[0m         \u001b[0mgraph_function\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_function_cache\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mprimary\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcache_key\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2149\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0mgraph_function\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2150\u001b[0;31m           \u001b[0mgraph_function\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_create_graph_function\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   2151\u001b[0m           \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_function_cache\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mprimary\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mcache_key\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgraph_function\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2152\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mgraph_function\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/eager/function.py\u001b[0m in \u001b[0;36m_create_graph_function\u001b[0;34m(self, args, kwargs, override_flat_arg_shapes)\u001b[0m\n\u001b[1;32m   2039\u001b[0m             \u001b[0marg_names\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0marg_names\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2040\u001b[0m             \u001b[0moverride_flat_arg_shapes\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0moverride_flat_arg_shapes\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2041\u001b[0;31m             capture_by_value=self._capture_by_value),\n\u001b[0m\u001b[1;32m   2042\u001b[0m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_function_attributes\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2043\u001b[0m         \u001b[0;31m# Tell the ConcreteFunction to clean up its graph once it goes out of\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/framework/func_graph.py\u001b[0m in \u001b[0;36mfunc_graph_from_py_func\u001b[0;34m(name, python_func, args, kwargs, signature, func_graph, autograph, autograph_options, add_control_dependencies, arg_names, op_return_value, collections, capture_by_value, override_flat_arg_shapes)\u001b[0m\n\u001b[1;32m    913\u001b[0m                                           converted_func)\n\u001b[1;32m    914\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 915\u001b[0;31m       \u001b[0mfunc_outputs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpython_func\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mfunc_args\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mfunc_kwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    916\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    917\u001b[0m       \u001b[0;31m# invariant: `func_outputs` contains only Tensors, CompositeTensors,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/eager/def_function.py\u001b[0m in \u001b[0;36mwrapped_fn\u001b[0;34m(*args, **kwds)\u001b[0m\n\u001b[1;32m    356\u001b[0m         \u001b[0;31m# __wrapped__ allows AutoGraph to swap in a converted function. We give\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    357\u001b[0m         \u001b[0;31m# the function a weak reference to itself to avoid a reference cycle.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 358\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0mweak_wrapped_fn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__wrapped__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    359\u001b[0m     \u001b[0mweak_wrapped_fn\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mweakref\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mref\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mwrapped_fn\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    360\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/training_v2_utils.py\u001b[0m in \u001b[0;36mdistributed_function\u001b[0;34m(input_iterator)\u001b[0m\n\u001b[1;32m     71\u001b[0m     \u001b[0mstrategy\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdistribution_strategy_context\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_strategy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     72\u001b[0m     outputs = strategy.experimental_run_v2(\n\u001b[0;32m---> 73\u001b[0;31m         per_replica_function, args=(model, x, y, sample_weights))\n\u001b[0m\u001b[1;32m     74\u001b[0m     \u001b[0;31m# Out of PerReplica outputs reduce or pick values to return.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     75\u001b[0m     all_outputs = dist_utils.unwrap_output_dict(\n",
      "\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/distribute/distribute_lib.py\u001b[0m in \u001b[0;36mexperimental_run_v2\u001b[0;34m(self, fn, args, kwargs)\u001b[0m\n\u001b[1;32m    758\u001b[0m       fn = autograph.tf_convert(fn, ag_ctx.control_status_ctx(),\n\u001b[1;32m    759\u001b[0m                                 convert_by_default=False)\n\u001b[0;32m--> 760\u001b[0;31m       \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_extended\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcall_for_each_replica\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfn\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    761\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    762\u001b[0m   \u001b[0;32mdef\u001b[0m \u001b[0mreduce\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mreduce_op\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvalue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/distribute/distribute_lib.py\u001b[0m in \u001b[0;36mcall_for_each_replica\u001b[0;34m(self, fn, args, kwargs)\u001b[0m\n\u001b[1;32m   1785\u001b[0m       \u001b[0mkwargs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1786\u001b[0m     \u001b[0;32mwith\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_container_strategy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mscope\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1787\u001b[0;31m       \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_call_for_each_replica\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfn\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1788\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1789\u001b[0m   \u001b[0;32mdef\u001b[0m \u001b[0m_call_for_each_replica\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/distribute/distribute_lib.py\u001b[0m in \u001b[0;36m_call_for_each_replica\u001b[0;34m(self, fn, args, kwargs)\u001b[0m\n\u001b[1;32m   2130\u001b[0m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_container_strategy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2131\u001b[0m         replica_id_in_sync_group=constant_op.constant(0, dtypes.int32)):\n\u001b[0;32m-> 2132\u001b[0;31m       \u001b[0;32mreturn\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   2133\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2134\u001b[0m   \u001b[0;32mdef\u001b[0m \u001b[0m_reduce_to\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mreduce_op\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvalue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdestinations\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/autograph/impl/api.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m    290\u001b[0m   \u001b[0;32mdef\u001b[0m \u001b[0mwrapper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    291\u001b[0m     \u001b[0;32mwith\u001b[0m \u001b[0mag_ctx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mControlStatusCtx\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstatus\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mag_ctx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mStatus\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mDISABLED\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 292\u001b[0;31m       \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    293\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    294\u001b[0m   \u001b[0;32mif\u001b[0m \u001b[0minspect\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0misfunction\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0minspect\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mismethod\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/training_v2_utils.py\u001b[0m in \u001b[0;36mtrain_on_batch\u001b[0;34m(model, x, y, sample_weight, class_weight, reset_metrics)\u001b[0m\n\u001b[1;32m    262\u001b[0m       \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    263\u001b[0m       \u001b[0msample_weights\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msample_weights\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 264\u001b[0;31m       output_loss_metrics=model._output_loss_metrics)\n\u001b[0m\u001b[1;32m    265\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    266\u001b[0m   \u001b[0;32mif\u001b[0m \u001b[0mreset_metrics\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/training_eager.py\u001b[0m in \u001b[0;36mtrain_on_batch\u001b[0;34m(model, inputs, targets, sample_weights, output_loss_metrics)\u001b[0m\n\u001b[1;32m    309\u001b[0m           \u001b[0msample_weights\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msample_weights\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    310\u001b[0m           \u001b[0mtraining\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 311\u001b[0;31m           output_loss_metrics=output_loss_metrics))\n\u001b[0m\u001b[1;32m    312\u001b[0m   \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mouts\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    313\u001b[0m     \u001b[0mouts\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mouts\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/training_eager.py\u001b[0m in \u001b[0;36m_process_single_batch\u001b[0;34m(model, inputs, targets, output_loss_metrics, sample_weights, training)\u001b[0m\n\u001b[1;32m    250\u001b[0m               \u001b[0moutput_loss_metrics\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0moutput_loss_metrics\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    251\u001b[0m               \u001b[0msample_weights\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msample_weights\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 252\u001b[0;31m               training=training))\n\u001b[0m\u001b[1;32m    253\u001b[0m       \u001b[0;32mif\u001b[0m \u001b[0mtotal_loss\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    254\u001b[0m         raise ValueError('The model cannot be run '\n",
      "\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/training_eager.py\u001b[0m in \u001b[0;36m_model_loss\u001b[0;34m(model, inputs, targets, output_loss_metrics, sample_weights, training)\u001b[0m\n\u001b[1;32m    164\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    165\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0mhasattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mloss_fn\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'reduction'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 166\u001b[0;31m           \u001b[0mper_sample_losses\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mloss_fn\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcall\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtargets\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mouts\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    167\u001b[0m           weighted_losses = losses_utils.compute_weighted_loss(\n\u001b[1;32m    168\u001b[0m               \u001b[0mper_sample_losses\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mIndexError\u001b[0m: list index out of range"
     ]
    }
   ],
   "source": [
    "# 四，训练模型\n",
    "#================================================================================\n",
    "printlog(\"step4: train model...\")\n",
    "\n",
    "model.compile(optimizer='adam',\n",
    "              loss='binary_crossentropy',\n",
    "              metrics=['accuracy'])\n",
    "\n",
    "history = model.fit(ds_train, validation_data=ds_test, epochs=10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 五，评估模型\n",
    "#================================================================================\n",
    "printlog(\"step5: eval model...\")\n",
    "\n",
    "model.summary()\n",
    "\n",
    "%matplotlib inline\n",
    "%config InlineBackend.figure_format = 'svg'\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "\n",
    "def plot_metric(history, metric):\n",
    "    train_metrics = history.history[metric]\n",
    "    val_metrics = history.history['val_' + metric]\n",
    "    epochs = range(1, len(train_metrics) + 1)\n",
    "    plt.plot(epochs, train_metrics, 'bo--')\n",
    "    plt.plot(epochs, val_metrics, 'ro-')\n",
    "    plt.title('Training and validation ' + metric)\n",
    "    plt.xlabel(\"Epochs\")\n",
    "    plt.ylabel(metric)\n",
    "    plt.legend([\"train_\" + metric, 'val_' + metric])\n",
    "    plt.show()\n",
    "\n",
    "\n",
    "plot_metric(history, \"accuracy\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.7"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {
    "height": "89px",
    "width": "361px"
   },
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": true,
   "toc_position": {
    "height": "calc(100% - 180px)",
    "left": "10px",
    "top": "150px",
    "width": "165px"
   },
   "toc_section_display": true,
   "toc_window_display": true
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
